8 votes

Comment changer l'orientation d'un SCNNode par rapport à la caméra avec ARKit

Le code ci-dessous place un SCNPlane sur le point touché, mais le plan est orienté (tourné) vers la position dans laquelle se trouvait le téléphone au démarrage de l'application. Idéalement, j'aimerais orienter le nœud vers un mur physique ou vers l'orientation actuelle de la caméra. Comment cela se fait-il avec ARKit ?

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else {return}
    let result = sceneView.hitTest(touch.location(in: sceneView), types: [ARHitTestResult.ResultType.featurePoint])
    guard let hitResult = result.last else {return}
    let hitTransform = SCNMatrix4.init(hitResult.worldTransform)

    let hitVector = SCNVector3Make(hitTransform.m41, hitTransform.m42, hitTransform.m43)
    createPlane(position: hitVector)
}

func createPlane(position: SCNVector3) {

    let background = SCNNode()
    background.geometry = SCNPlane.init(width: 0.12, height: 0.10) // better set its size
    background.geometry?.firstMaterial?.diffuse.contents = "odinBW2.jpeg"
    background.position = position

    sceneView.scene.rootNode.addChildNode(background)

}

11voto

Jun Tanaka Points 51

Si vous voulez aligner votre nœud sur l'orientation de la caméra, utilisez simplement SCNBillboardConstraint .

let yourNode = SCNNode()

let billboardConstraint = SCNBillboardConstraint()
billboardConstraint.freeAxes = [.X, .Y, .Z]
yourNode.constraints = [billboardConstraint]

7voto

Oscar Points 1078

1 - C'est ainsi que vous obtenez d'abord la rotation de la caméra :

Pitch - rotation autour de l'axe X

let pitch = sceneView.session.currentFrame?.camera.eulerAngles.x 

Yawn - rotation autour de l'axe Y

let yawn = sceneView.session.currentFrame?.camera.eulerAngles.y

Roll - rotation autour de l'axe Z

let roll = sceneView.session.currentFrame?.camera.eulerAngles.z

2 - Et ensuite vous pouvez créer le SCNVector3 qui correspond aux rotations que vous voulez garder (0 si vous ne voulez aucune rotation sur un axe) :

let newRotation = SCNVector3Make(pitch, yawn, roll)

3 - Et ensuite vous attribuez cet eulerAngles à votre noeud :

whateverNode.eulerAngles = newRotation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X