在我的程序中,我试图让自己与其他对象发生碰撞,以便我可以测试碰撞。有没有办法在跟随你的新 AR 套件中添加一个与我一起移动的物理体?我可以在 AR 开头的位置制作一个,但我确信有一种方法可以将其添加到您的真实 self 中。
最佳答案
美好的一天! 您的问题有一个解决方案。 首先,您需要创建一个碰撞器。例如:
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协议(protocol)并调用方法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
}
}
}
附注不要忘记添加
self.sceneView.delegate = self
到你的viewDidLoad。
祝你好运。我希望它有帮助!
关于swift - 在 AR 套件中给自己一个物理 body ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44510438/