2008-10-19 5 views
4

Je joue avec quelques algorithmes sur Internet depuis un moment et je n'arrive pas à les faire fonctionner, donc je lance la question ici; J'essaye de rendre une ligne de vecteur de vitesse à partir d'un point. Tracer la ligne n'est pas difficile: il suffit d'insérer une ligne avec la longueur velocity.length dans le graphique. Cela place la ligne centrée sur le point dans la direction de l'axe des y. Nous devons obtenir ceci maintenant dans la rotation et la traduction appropriées. Le vecteur de traduction n'est pas difficile à calculer: il s'agit de la moitié du vecteur de vitesse. La matrice de rotation, cependant, est extrêmement insaisissable pour moi. Étant donné un vecteur directionnel <x, y, z>, quelle est la matrice dont j'ai besoin?Matrice de rotation pour le vecteur de direction

Édition 1: Regardez; Si vous ne comprenez pas la question, vous ne serez probablement pas en mesure de me donner une réponse.

Voici ce que j'ai actuellement:

     Vector3f translation = new Vector3f(); 
        translation.scale(1f/2f, body.velocity); 

        Vector3f vec_z = (Vector3f) body.velocity.clone(); 
        vec_z.normalize(); 

        Vector3f vec_y; // reference vector, will correct later 
        if (vec_z.x == 0 && vec_z.z == 0) { 
         vec_y = new Vector3f(-vec_z.y, 0f, 0f); // could be optimized 
        } else { 
         vec_y = new Vector3f(0f, 1f, 0f); 
        } 
        Vector3f vec_x = new Vector3f(); 
        vec_x.cross(vec_y, vec_z); 
        vec_z.normalize(); 

        vec_y.cross(vec_x, vec_z); 
        vec_y.normalize(); 
        vec_y.negate(); 

        Matrix3f rotation = new Matrix3f(
         vec_z.z, vec_z.x, vec_z.y, 
         vec_x.z, vec_x.x, vec_x.y, 
         vec_y.z, vec_y.x, vec_y.y 
        ); 

        arrowTransform3D.set(rotation, translation, 1f);

basé sur de this article. Et oui, j'ai essayé la matrice de rotation standard (vec_x.x, vec_y.x, etc) et cela n'a pas fonctionné. J'ai fait tourner les colonnes et les lignes pour voir s'il y a un effet.

Edit 2:

Toutes mes excuses au sujet du libellé grossier de mes commentaires.

Il semble donc qu'il y ait eu une combinaison de deux erreurs; un de ceux que House MD signalait (vraiment mauvais nom des variables: vec_z était en fait vec_y, et ainsi de suite), et l'autre était que j'avais besoin d'inverser la matrice avant de la passer au moteur de rendu (la transposition était proche!). Ainsi, le code modifié est:

     Vector3f vec_y = (Vector3f) body.velocity.clone(); 
        vec_y.normalize(); 

        Vector3f vec_x; // reference vector, will correct later 
        if (vec_y.x == 0 && vec_y.z == 0) { 
         vec_x = new Vector3f(-vec_y.y, 0f, 0f); // could be optimized 
        } else { 
         vec_x = new Vector3f(0f, 1f, 0f); 
        } 

        Vector3f vec_z = new Vector3f(); 
        vec_z.cross(vec_x, vec_y); 
        vec_z.normalize(); 

        vec_x.cross(vec_z, vec_y); 
        vec_x.normalize(); 
        vec_x.negate(); 

        Matrix3f rotation = new Matrix3f(
         vec_x.x, vec_x.y, vec_x.z, 
         vec_y.x, vec_y.y, vec_y.z, 
         vec_z.x, vec_z.y, vec_z.z 
        ); 
        rotation.invert();
+0

Votre question est presque impossible à comprendre, en particulier la partie sur "la moitié du vecteur vitesse". –

+0

Pourquoi appelez-vous vec_z.normalize deux fois, et quel est le ici? –

+0

C'était une faute de frappe dans le code original.Cela n'a pas vraiment changé la solution finale, mais cela aurait rendu la mise à l'échelle plutôt funky. :-) –

Répondre

1

Dupe.

La question consiste à y faire une rotation à un certain axe, alors que je suis préoccupé par obtenir une matrice de rotation .

Gee, je me demande si vous pouvez tourner convert one to the other? BTW, votre solution actuelle de choisir un axe y arbitraire, puis réorthogonaliser devrait fonctionner correctement; il semble buggé bien, ou au moins mal écrit. 'z_vec' n'est pas un bon nom de variable pour l'axe des ordonnées. Qu'en est-il de la commande 'z, x, y', de toute façon? Si cela ne fonctionne toujours pas, essayez de faire des changements aléatoires jusqu'à ce qu'il le fasse - transposez la matrice, annulez les vecteurs jusqu'à ce que vous ayez un nombre pair d'erreurs de signe, ce genre de choses.

Votre ton de voix apparaît également impoli, étant donné que vous demandez à des étrangers de passer leur temps à vous aider.

+0

La question là-bas implique une rotation à un certain axe, alors que je suis intéressé par l'obtention d'une matrice de rotation. –

+0

Voir mes commentaires sur la réponse ci-dessus. Oui, je pourrais le faire, mais j'aimerais que la mise en œuvre ci-dessus fonctionne. –

+0

Désolé à ce sujet. Je travaille depuis plusieurs heures sur ce sujet, donc je suis assez frustré en ce moment. –

1

This devrait-vous

+1

Cela ne fonctionne pas, car je n'ai pas d'angles; seulement le vecteur de direction désiré. –

+0

SOH CAH TOA Si vous ne connaissez pas votre niveau de base, vous ne devriez pas utiliser des vecteurs ... – Simon

+1

Je sais que je peux travailler les angles , mais c'est extrêmement inefficace. Il devrait être possible de comprendre la matrice en utilisant uniquement des produits croisés. –