2017-05-25 3 views
0

Je travaille sur un projet SceneKit et je souhaite faire pivoter un objet sur trois axes (axe du monde) mais une fois que je fais tourner l'objet, la prochaine rotation est effectuée par rapport au nouvel axe pivoté. Imaginez un cube que vous devriez pouvoir faire tourner sur les axes x et y et z absolus en utilisant trois boutons par rapport au monde.Rotation le long de l'axe du monde

Pour autant que je sais que les options suivantes pour SCNAction:

  • SCNAction.rotateTo (x: 1,0, y: 0,0, z 0,0, durée: 0,5, usesShortestUnitArc: true)
  • SCNAction.rotateTo (x: 1,0, y: 0,0, z 0,0, durée: 0,5)
  • SCNAction.rotateBy (x: 1,0, y: 0,0, z 0,0, durée: 0,5)
  • SCNAction. rotate (par: 0.0, autour de: SCNVector3, duration: 0.5)
  • SCNAction.rotate (toAxisAngle: SCNVector4, durée: 0,5)

Malheureusement, aucun d'entre eux sont absolus, tous d'entre eux comptent sur la rotation précédente. Connaissez-vous un moyen de mettre en œuvre la véritable rotation de l'axe mondial absolu?

Merci pour l'aide à l'avance!

Répondre

3

Pour faire pivoter un noeud autour de l'axe du monde, multipliez les noeuds worldTransform par la matrice de rotation.

Je n'ai pas trouvé de solution avec SCNAction, mais en utilisant SCNTransaction c'est assez simple.

func rotate(_ node: SCNNode, around axis: SCNVector3, by angle: CGFloat, duration: TimeInterval, completionBlock: (()->())?) { 
    let rotation = SCNMatrix4MakeRotation(angle, axis.x, axis.y, axis.z) 
    let newTransform = node.worldTransform * rotation 

    // Animate the transaction 
    SCNTransaction.begin() 
    // Set the duration and the completion block 
    SCNTransaction.animationDuration = duration 
    SCNTransaction.completionBlock = completionBlock 

    // Set the new transform 
    node.transform = newTransform 

    SCNTransaction.commit() 
} 

Cela ne fonctionne pas si le noeud a un parent avec un autre transformation, mais nous pouvons résoudre ce problème en convertissant le résultat transformer aux parents un espace de coordonnées.

Vous pouvez essayer cela dans this Swift Playground.

J'espère que c'est ce que vous cherchez.

+0

Merci Orangenkopf, bonne idée! – Velykovits

+0

Sauvé ma journée, merci !! –

+0

Est-ce que cela devrait également s'appliquer si la position du parent n'est pas (0,0,0)? Lorsque j'essaie cette approche, le nœud tourne autour de l'axe parent plutôt que de tourner sur son propre axe (converti) - ai-je raté quelque chose? –