swift - 在 AR 套件中给自己一个物理 body ?

标签 swift xcode augmented-reality

在我的程序中,我试图让自己与其他对象发生碰撞,以便我可以测试碰撞。有没有办法在跟随你的新 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/

相关文章:

ios - swift 错误 : "...whose view is not in the window hierarchy." performseguewithidentifier

Swift 2 MKMapViewDelegate rendererForOverlay 可选性

swift - 在 Swift 中查找数字的数字总和

xcode - Storyboard中的 NSStatusBar 项目 (OSX)

augmented-reality - 没有标记的增强现实应用程序

animation - 将动画 3D 模型转换为 Quake 2 的模型

ios - 测试时默认 undoManager 为 nil

xcode - 将嵌入式框架导入 Watch Extension

ios - Swift:在计时器期间触发音效

android - 具有 3D 模型的基于位置的增强现实框架(Android、iOS)?