2017-08-30 7 views
3

C'est probablement plus une question d'algèbre linéaire, mais disons que j'ai un SCNVector et que je veux un nouveau SCNVector qui soit incliné par rapport à l'original autour de l'axe y (ou n'importe quel axe). Donc idéalement:Faire pivoter SCNVector3 autour d'un axe

extension SCNVector3 { 
    // assume dot, cross, length, +, - functions are available. 
    enum Axis { 
     case x, y, z 
    } 
    func rotatedVector(aroundAxis: Axis, angle: Float) -> SCNVector3 { 
     // code from smart person goes here 
    } 
} 

par exemple. (0,0,-1).rotatedVector(aroundAxis: y, angle: pi/2) = (1,0,0)

Merci!

Répondre

0

Eh bien grâce à un comment on gamedev.net je pense avoir ce dont j'ai besoin. Cela ne fonctionne pas pour des angles arbitraires, mais comme il s'avère que je n'ai besoin que de 90 °, cela fonctionne pour moi. Voici la solution:

extension SCNVector3 { 
    enum Axis { case x, y, z } 
    enum Direction { case clockwise, counterClockwise } 
    func orthogonalVector(around axis: Axis, direction: Direction) -> SCNVector3 { 
     switch axis { 
     case .x: return direction == .clockwise ? SCNVector3(self.x, -self.z, self.y) : SCNVector3(self.x, self.z, -self.y) 
     case .y: return direction == .clockwise ? SCNVector3(-self.z, self.y, self.x) : SCNVector3(self.z, self.y, -self.x) 
     case .z: return direction == .clockwise ? SCNVector3(self.y, -self.x, self.z) : SCNVector3(-self.y, self.x, self.z) 
     } 
    } 
} 
1

En général, utilisez Rodrigues' rotation formula.

la formule de rotation de Rodrigues est un algorithme efficace pour faire tourner un vecteur dans l'espace, compte tenu d'un axe et angle de rotation

pour le vecteur initial v, l'unité de l'axe de rotation vecteur k et résultat angle thêta est

v pourriture = v cos * (thêta) + (kx v) * sin (thêta) + k * (k .dot. v) * (1 - cos (thêta))

+0

Est-ce que c'est pour l'espace droitier ou gaucher? –

+1

Emm ... Je traite toujours avec droitier avec angle de rotation theta - CCW contre la direction de l'axe. Il semble que la maniabilité est importante ici pour le deuxième terme qui contient le produit vectoriel. Mais il contient aussi une fonction sinusoïdale, donc je ne peux pas dire - que la maniabilité influence le résultat - cela dépend de la convention sur la direction des angles. – MBo