web-dev-qa-db-fra.com

Comment attachez-vous un objet à la position de votre caméra avec ARKit Swift?

J'ai des objets en mouvement que je veux avoir pour pouvoir entrer en collision avec moi le joueur. J'ai la capacité de lancer des objets à partir de moi en obtenant ma position/direction actuelle à ce moment-là, mais je ne comprends pas comment me fixer un objet qui suivra mon positionnement à tout moment.

5
JoshKopen

Dans SceneKit, tout ce qui peut avoir une position dans la scène est (attaché à) un nœud. Cela inclut non seulement les objets visibles, mais également les sources de lumière et les caméras. Lorsque vous utilisez ARSCNView, il reste une caméra SceneKit, mais ARKit contrôle sa position/son orientation. 

Les nœuds SceneKit créent une hiérarchie: la position (et l'orientation, etc.) de chaque nœud est relative à son nœud parent. Si le nœud parent se déplace dans la scène, ses enfants le suivent afin de conserver les mêmes positions relatives par rapport au parent. Donc, si vous voulez que quelque chose garde toujours la même position par rapport à la caméra, vous devriez en faire un enfant du noeud de la caméra. 

Même dans les scènes où vous ne créez pas de caméra vous-même - par exemple lorsque SceneKit et ARKit gèrent la caméra pour vous - vous pouvez obtenir le nœud contenant la caméra actuelle avec la propriété pointOfView de la vue. (Remarque: ARSCNView est une sous-classe de SCNView, dont la plupart des API utiles sont définies par le protocole SCNSceneRenderer .) 

Vous devrez peut-être attendre que la session commence à s'exécuter pour accéder au nœud de caméra géré par ARKit. 

17
rickster

ARSCNView a une propriété 'pointOfView'. Vous pouvez y attacher un noeud enfant.

let ball = SCNSphere(radius: 0.02)
ballNode = SCNNode(geometry: ball)
ballNode?.position = SCNVector3Make(0, 0, -0.2)
sceneView.pointOfView?.addChildNode(ballNode!)

Le nœud suivra votre caméra où que vous soyez.

9
Jimi

Les codes suivants me permettent d’obtenir la position actuelle (coordonnées x, y, z) de la caméra.

    let pov = sceneView.pointOfView
    let position = pov?.position

    let x = position?.x
    let y = position?.y
    let z = position?.z
1
Ummar Ahmed

Vous devez prendre la réponse de Jimi et donner à la balle une couleur ou une texture pour la voir:

let ball = SCNSphere(radius: 0.02)
ball.firstMaterial?.diffuse.contents = UIColor.red
let ballNode = SCNNode(geometry: ball)
ballNode.position = SCNVector3Make(0, 0, -0.2)
self.sceneView.pointOfView?.addChildNode(ballNode)
0
jeffslofish