2017-08-23 4 views
0

Dans ARKit/SceneKit, lorsque l'utilisateur appuie sur le bouton, je souhaite appliquer une impulsion à mon nœud. Je veux que l'impulsion vienne du point de vue de l'utilisateur actuel. Cela signifie que le nœud s'éloignerait de la perspective de l'utilisateur. Je suis en mesure d'obtenir l'orientation/direction actuelle, grâce à ce code:Comment appliquer SCNVector3 force/impulsion à partir d'une orientation dans 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)) 
} 

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

J'ai un SCNVector arbitraire, que je l'ai créé. Il contient des informations sur la hauteur (axe des ordonnées), combien à gauche ou à droite, et combien à transmettre au nœud.

Je souhaite convertir/traduire mon SCNVector3 pour qu'il provienne de l'orientation/direction de la caméra.

Signification, je

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

Comment puis-je appliquer le force du lieu/origine du direction?

Répondre

0

Nous l'avons trouvé après beaucoup de googling. Pour convertir le vecteur d'impulsion3 dans la direction dont j'ai besoin, j'ai utilisé quelque chose comme ceci:

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)