在AR套件中给自己一个物理身体?

时间:2017-06-13 00:04:59

标签: swift xcode augmented-reality

在我的程序中,我试图使自己可以与其他对象碰撞,以便我可以测试碰撞。有没有办法在跟随你的新AR套件中添加一个与我自己一起移动的物理体?我可以在AR的开头创建一个我的位置,但我确信有一种方法可以将它添加到您的实际自我中。

1 个答案:

答案 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。

祝你好运。我希望它有所帮助!