Rotation D'un vecteur dans L'espace 3D

je réalise un projet android à OpenGLES qui utilise l'accéléromètre pour calculer les changements dans les axes spécifiques et mon but est de faire tourner le vecteur de mouvement de mon objet semblable à un engin spatial. Le problème est que je ne peux pas comprendre les maths derrière les matrices de rotation. Le vecteur de mouvement par défaut est 0,1,0, signifie +y, de sorte que l'objet regarde vers le haut au début. et j'essaie de faire pivoter son vecteur de mouvement pour que je puisse déplacer l'objet où il pointe. Je peux trouver des changements de rotation dans le téléphone. axe des x : rotation[0], axe des y: rotation[1], axe des z : rotation[2]. Comment puis-je tourner mon vecteur de mouvement en utilisant la matrice de rotation ?

34
demandé sur legends2k 2013-01-30 19:31:42

2 réponses

Si vous voulez faire tourner un vecteur vous devez construire ce qui est connu comme un matrice de rotation.

Rotation en 2D

dites que vous voulez faire tourner un vecteur ou un point par θ, puis trigonométrie états que les nouvelles coordonnées sont

    x' = x cos θ − y sin θ
    y' = x sin θ + y cos θ

pour le démontrer, prenons les axes cardinaux de X et Y; quand on fait tourner l'axe x à 90° dans le sens contraire des aiguilles d'une montre, on devrait se retrouver avec l'axe X transformé en axe Y. Axe des abscisses en tant que vecteur-unité

    unit vector along X axis = <1, 0>
    x' = 1 cos 90 − 0 sin 90 = 0
    y' = 1 sin 90 + 0 cos 90 = 1
    New coordinates of the vector = <x', y'> = <0, 1> => Y-axis.

quand vous comprenez ceci, Créer une matrice pour faire ceci devient simple. Une matrice est juste un outil mathématique pour effectuer ceci d'une manière confortable et généralisée de sorte que diverses transformations comme la rotation, l'échelle et la traduction (en mouvement) peuvent être combinées et effectuées en une seule étape, en utilisant une méthode commune. De l'algèbre linéaire, pour faire tourner un point ou un vecteur en 2D, la matrice à construire est

    |cos θ   −sin θ| |x| = |x cos θ − y sin θ| = |x'|
    |sin θ    cos θ| |y|   |x sin θ + y cos θ|   |y'|

Rotation en 3D

qui fonctionne en 2D, alors QU'en 3D nous devons prendre en compte le troisième axe. Tourner un vecteur autour de l'origine (un point) en 2D signifie simplement le faire tourner autour de L'axe Z (une ligne) en 3D; puisque nous tournons autour de l'axe Z, ses coordonnées doivent être maintenues constantes à 0° (la rotation se produit sur le plan XY en 3D). En 3D tournant autour de L'axe Z serait

    |cos θ   −sin θ   0| |x|   |x cos θ − y sin θ|   |x'|
    |sin θ    cos θ   0| |y| = |x sin θ + y cos θ| = |y'|
    |  0       0      1| |z|   |        z        |   |z'|

autour de l'axe Des Y serait

    | cos θ    0   sin θ| |x|   | x cos θ + z sin θ|   |x'|
    |   0      1       0| |y| = |         y        | = |y'|
    |−sin θ    0   cos θ| |z|   |−x sin θ + z cos θ|   |z'|

autour de l'axe des X serait

    |1     0           0| |x|   |        x        |   |x'|
    |0   cos θ    −sin θ| |y| = |y cos θ − z sin θ| = |y'|
    |0   sin θ     cos θ| |z|   |y sin θ + z cos θ|   |z'|

Notez que l'axe où la rotation est fait n'a pas de sin ou cos éléments dans la matrice. J'espère que cela clarifie le cas de la rotation.

Composition

les matrices susmentionnées tournent un objet comme si l'objet était à une distance r = √(x2 + y2) de l'origine; recherche coordonnées polaires pour savoir pourquoi. Cette rotation se fera en fonction de l'origine spatiale mondiale. Habituellement, nous avons besoin de tourner un objet autour de son propre cadre/pivot et non autour du monde. Depuis pas tous les objets sont à l'origine du monde, tourner en utilisant ces matrices ne donnera pas le résultat souhaité de tourner autour du propre cadre de l'objet. Par conséquent, vous avez besoin d'apprendre sur la traduction aussi. Vous devez d'abord traduire (déplacer) l'objet à l'origine du monde (de sorte que l'origine de l'objet s'alignerait avec celle du monde, faisant ainsi r = 0), effectuer la rotation avec une (ou plusieurs) de ces matrices et ensuite le traduire de nouveau à son emplacement précédent. L'ordre dans lequel les transformations sont appliquées .

je vous invite à lire sur les transformations linéaires et affines et leur composition pour effectuer de multiples transformations en une seule prise de vue, avant de jouer avec les transformations en code. Sans comprendre les mathématiques de base qui se cachent derrière cela, les transformations de débogage seraient un cauchemar. J'ai trouvé cette conférence vidéo pour être une très bonne ressource. Une autre ressource est ce tutoriel sur les transformations qui se veut intuitif et illustre les idées avec animation.

Remarque: cette méthode d'exécution des rotations suit le Euler angle système de rotation, qui est plus simple à enseigner et à saisir. Cela fonctionne parfaitement bien pour 2D et pour les cas 3D simples; mais lorsque la rotation doit être effectuée autour des trois axes en même temps, alors les angles D'Euler ne sont pas suffisants pour cela en raison d'une déficience inhérente à ce système qui se manifeste comme Gimbal lock. Les gens resort Quaternion s dans de telles situations, qui est plus avancé que celui-ci, mais ne souffre pas de serrures à cardan lorsqu'il est utilisé correctement.

103
répondu legends2k 2015-12-12 09:59:29

Référence docs ici: http://developer.android.com/reference/android/opengl/Matrix.html

  1. Construire une matrice de rotation
  2. transformer le vecteur avec la matrice

Vous n'avez pas besoin de comprendre les mathématiques, les fonctions de la bibliothèque le travail sera fait.

2
répondu Minthos 2013-01-30 16:23:00