【问题标题】:How to create lines with start and end points in Swift (ARKit, SCNKit)如何在 Swift (ARKit, SCENEKit) 中创建带起点和终点的线
【发布时间】:2019-04-17 17:30:01
【问题描述】:

我想创建一条线,我可以告诉它在 ARKit 的场景中从哪里开始和在哪里结束。其他人做了这门课,但我得到了错误。像 node... 的 startLine 和 node... 的 endLine 这样简单的东西会很有帮助。我觉得在两点之间做一条简单的线不应该那么复杂,所以如果你的答案很复杂,请解释为什么它必须如此。谢谢大家的帮助!

class LineNode: SCNNode {

private(set) var cylinder: SCNCylinder
private(set) var positionA: SCNVector3
private(set) var positionB: SCNVector3

init(with startingPoint: SCNVector3, endPoint: SCNVector3, radius: Float = 0.02, color: UIColor = .red) {
    self.positionA = startingPoint
    self.positionB = endPoint
    let vector = endPoint - startingPoint  *//error*
    let height = vector.length()
    cylinder = SCNCylinder(radius: radius, height: Float(height))
    cylinder.radialSegmentCount = 8
    cylinder.firstMaterial?.diffuse.contents = color
    super.init()
    geometry = cylinder
    position = (endPoint + startingPoint) / 2   *//error*
    eulerAngles = SCNVector3.lineEulerAngles(vector: vector)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }
}

// 我得到错误:二元运算符'-'不能应用于两个'SCNVector3'操作数

【问题讨论】:

    标签: swift vector line arkit


    【解决方案1】:

    如果你想在 Vector 上使用 '+/-',你需要编写一个扩展。只需将其粘贴到类定义下即可。

    class ... {
     // class code
    }
    func + (left: SCNVector3, right: SCNVector3) -> SCNVector3 {
        return SCNVector3Make(left.x + right.x, left.y + right.y, left.z + right.z)
    }
    
    func - (left: SCNVector3, right: SCNVector3) -> SCNVector3 {
        return SCNVector3Make(left.x - right.x, left.y - right.y, left.z - right.z)
    }
    

    把它贴在类括号下面

    【讨论】:

    • 转换有效,但随后我在代码上遇到其他错误。我觉得这不是解决这个问题的最佳方法。您对如何解决此问题有任何想法吗?基本上在 ARKit 中创建一条连接两个 3d 对象的 3d 线?似乎某处会有一个 drawLine() 方法,但我花了很多时间阅读文档,但我没有得到任何结果。似乎我在错误的地方阅读,或者我只是不明白或两者兼而有之。无论如何,任何想法都将不胜感激。
    • 你查看过 Github 上的 Boxify 项目吗? self.lineDA.setPosition(from: point, distance: size.z , axis: .z) 和设置的位置函数看起来像这样:``` ... let absDistance = CGFloat(abs(distance)) let offset = distance * 0.5 switch axis { case .x: box.width = absDistance self.position = position + SCNVector3(x: offset, y: 0, z: 0) case .y: .. case .z: ... }
    【解决方案2】:

    SCNVector3 是一个结构,而不是一个类。您不能应用“-”运算符。

    所以我们可以使用旧值创建另一个 SCNVector3。

    let vector = SCNVector3(endPoint.x - startingPoint.x, startingPoint.y, startingPoint.z)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 2018-09-27
      • 2020-04-01
      • 2019-10-10
      相关资源
      最近更新 更多