在我的程序中,我试图使自己可以与其他对象碰撞,以便我可以测试碰撞。有没有办法在跟随你的新AR套件中添加一个与我自己一起移动的物理体?我可以在AR的开头创建一个我的位置,但我确信有一种方法可以将它添加到您的实际自我中。
答案 0 :(得分:0)
美好的一天! 有一个问题的解决方案。 首先,您需要创建一个对撞机。例如:
func addCollider(position: SCNVector3, name: String) {
let collider = SCNNode(geometry: SCNSphere(radius: 0.5))
collider.position = position
collider.geometry?.firstMaterial?.diffuse.contents = UIColor.clear
collider.physicsBody?.categoryBitMask = 0 // example
collider.physicsBody?.contactTestBitMask = 1 // example
collider.name = name
sceneView.scene.rootNode.addChildNode(collider)
}
不要忘记添加适当的位掩码,以便与其他物体发生碰撞。
接下来,您需要实现ARSCNViewDelegate协议并调用方法willRenderScene。接下来,您需要找到您的观点并将其转换为矩阵。您需要从矩阵的第三列中提取值以获取当前方向。要获取当前位置,您需要从矩阵中提取第四列的值。最后,您需要结合您的位置和方向来获取当前位置。 要组合到SCNVector3值,您需要编写全局函数“+”。例如:
func +(left: SCNVector3, right: SCNVector3) -> SCNVector3 {
return SCNVector3Make(left.x + right.x, left.y + right.y, left.z + right.z)
}
请确保您在类或结构之外编写此方法。
最终协议!一种将碰撞器相应移动到当前位置的功能。
func renderer(_ renderer: SCNSceneRenderer, willRenderScene scene: SCNScene, atTime time: TimeInterval) {
guard let pontOfView = self.sceneView.pointOfView else { return }
let transform = pontOfView.transform
let orientation = SCNVector3(-transform.m31, -transform.m32, -transform.m33)
let location = SCNVector3(transform.m41, transform.m42, transform.m43)
let currentPosition = orientation + location
for node in sceneView.scene.rootNode.childNodes {
if node.name == "your collider name" {
node.position = currentPosition
}
}
}
P.S。别忘了添加
self.sceneView.delegate = self
到你的viewDidLoad。
祝你好运。我希望它有所帮助!