首页 文章

如何从 scenekit 中的方向应用 SCNVector3 force/impulse?

提问于
浏览
0

在 ARKit/SceneKit 中,当用户点击按钮时,我想对我的节点施加一个冲动。我希望这种冲动来自当前用户的观点。这意味着节点将远离用户的角度。由于这段代码,我能够得到当前的 orientation/direction:

func getUserVector() -> (SCNVector3, SCNVector3) { // (direction, position)
    if let frame = self.sceneView.session.currentFrame {
        let mat = SCNMatrix4(frame.camera.transform) // 4x4 transform matrix describing camera in world space
        let dir = SCNVector3(-1 * mat.m31, -1 * mat.m32, -1 * mat.m33) // orientation of camera in world space
        let pos = SCNVector3(mat.m41, mat.m42, mat.m43) // location of camera in world space

        return (dir, pos)
    }
    return (SCNVector3(0, 0, -1), SCNVector3(0, 0, -0.2))
}

通过https://github.com/farice/ARShooter/blob/master/ARViewer/ViewController.swift#L191

我有一个任意的 SCNVector,我已经创建了。它包含有关高(Y 轴),向左或向右多少以及向节点应用多少前进的信息。

我想 convert/translate 我的 SCNVector3 来自相机的 orientation/direction。

意思是,我有

let (direction, position) = self.getUserVector()
let force = SCNVector3(x: 1.67, y: 13.83, z: -18.3)

如何应用direction的 location/origin 中的force

1 回答

  • 2

    经过大量的谷歌搜索后想出来。要将脉冲向量 3 转换为我需要的方向,我使用了这样的东西:

    let original = SCNVector3(x: 1.67, y: 13.83, z: -18.3)
    let force = simd_make_float4(original.x, original.y, original.z, 0)
    let rotatedForce = simd_mul(currentFrame.camera.transform, force)
    
    let vectorForce = SCNVector3(x:rotatedForce.x, y:rotatedForce.y, z:rotatedForce.z)
    node.physicsBody?.applyForce(vectorForce, asImpulse: true)
    

相关问题