如何在 Swift 中创建具有起点和终点的线条(ARKit、SCENEKit)
How to create lines with start and end points in Swift (ARKit, SCNKit)
我想创建一条线,我可以告诉它在 ARKit 的场景中从哪里开始和从哪里结束。其他人制作了这个 class 但我收到错误。像 startLine at node... 和 endLine at node... 这样简单的东西会有帮助。我觉得在两点之间做一条简单的线不应该那么复杂,所以如果你的答案很复杂,请解释为什么必须如此。感谢大家的帮助!
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")
}
}
// 我得到 error:Binary 运算符 '-' 不能应用于两个 'SCNVector3' 操作数
SCNVector3 是一个结构,而不是 class。您不能应用“-”运算符。
因此我们可以使用旧值创建另一个 SCNVector3。
let vector = SCNVector3(endPoint.x - startingPoint.x, startingPoint.y, startingPoint.z)
如果要在 Vector 上使用“+/-”,则需要编写扩展。只需将其粘贴到 class 定义下即可。
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)
}
post 它在 class 括号下面
我想创建一条线,我可以告诉它在 ARKit 的场景中从哪里开始和从哪里结束。其他人制作了这个 class 但我收到错误。像 startLine at node... 和 endLine at node... 这样简单的东西会有帮助。我觉得在两点之间做一条简单的线不应该那么复杂,所以如果你的答案很复杂,请解释为什么必须如此。感谢大家的帮助!
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")
}
}
// 我得到 error:Binary 运算符 '-' 不能应用于两个 'SCNVector3' 操作数
SCNVector3 是一个结构,而不是 class。您不能应用“-”运算符。
因此我们可以使用旧值创建另一个 SCNVector3。
let vector = SCNVector3(endPoint.x - startingPoint.x, startingPoint.y, startingPoint.z)
如果要在 Vector 上使用“+/-”,则需要编写扩展。只需将其粘贴到 class 定义下即可。
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)
}
post 它在 class 括号下面