2017-08-23 8 views
0

ARKit/SceneKitでは、ユーザーがボタンをタップすると、自分のノードにインパルスを適用したいと思います。私は衝動が現在のユーザーの視点から来るようにしたい。これは、ノードがユーザの視点から遠ざかることを意味します。私は、このコードのおかげで現在の方向/方向を取得することができるよ:SCNVector3のforce/impulseをscenekitの方向から適用する方法は?

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軸)、左または右にどれだけの大きさがあり、どのくらい前向きにノードに適用するかに関する情報が含まれています。

SCNVector3をカメラの向き/方向から変換/変換したいと考えています。

意味では、私はdirectionの場所/原点からforceを適用するにはどうすればよい

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

がありますか?

答えて

0

多くのグーグルの後にそれを見つけました。インパルスベクトル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) 
関連する問題