2017-03-04 9 views
-1

Je travaille actuellement sur les intermédiaires entre un moteur physique et un moteur de rendu. Mon moteur de physique prend une série de forces et de positions et renvoie un quaternion.Problèmes avec la matrice de rotation

Je convertis actuellement ce quaternion en une matrice de rotation en utilisant les réponses à ma question précédente (qui fonctionne bien). Mon système de coordonnées est z dans l'écran, y-up et x-right.

Maintenant, après toute cette exposition, j'ai testé en tournant un seul axe à la fois. Je peux tourner autour de l'axe y et l'axe z sans aucun problème quoi que ce soit. Cependant, lorsque je tente de tourner autour de l'axe z, le système produit un résultat bizarre. La rotation est bonne, mais comme elle tourne, l'objet s'aplatit (ie: échelles négativement) dans la direction z, avant de "retourner" et de revenir à la pleine échelle. Il le fait tous les 90 degrés, à un décalage de 45 degrés par rapport aux directions cardinales.

Ceci est mon code pour convertir mon quaternion à une matrice de rotation:

Matrix4f output = new Matrix4f(); 
    output.setIdentity(); 

    if(input.length()!=0){ 
    input.normalise(); 
    } 

    float xx = input.x * input.x; 
    float xy = input.x * input.y; 
    float xz = input.x * input.z; 
    float xw = input.x * input.w; 

    float yy = input.y * input.y ; 
    float yz = input.y * input.z; 
    float yw = input.y * input.w; 

    float zz = input.z * input.z; 
    float zw = input.z * input.w; 


    output.m00 = 1 -2*((yy+zz)); 
    output.m01 = 2*(xy+zw); 
    output.m02 = 2*(xz-yw); 

    output.m10 = 2*(xy-zw); 
    output.m11 = 1 - (2*(xx+zz)); 
    output.m12 = 2*(yz+xw); 

    output.m20 = 2*(xz+yw); 
    output.m21 = 2*(yz+xw); 
    output.m22 = 1-(2*(xx+yy)); 

Maintenant, je suis regarder cela en temps réel lors de la rotation de l'objet, et je ne vois rien qui ne devrait pas être là. De plus, cela passe directement de cette équation à opengl, donc c'est vraiment hors de moi que je devrais avoir ce problème. Des idées?

Répondre

1

output.m21 = 2*(yz+xw); devrait être output.m21 = 2*(yz-xw);

+0

Cloué lui, merci beaucoup. – Peter