如何在Swift(ARKit,SCNKit)中使用起点和终点创建线

时间:2019-04-13 22:52:29

标签: swift vector line arkit

我想创建一条线,告诉我ARKit场景中的起点和终点。有人上了这个课,但我出错了。诸如startLine在节点上...和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'操作数

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

如果要在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)
}

将其张贴在班级括号下方