Question

Cela fait quelque temps que je joue avec des algorithmes sur Internet et je n'arrive pas à les faire fonctionner. Je lance donc la question ici;

J'essaie de rendre une ligne de vecteur vitesse à partir d'un point. Tracer la ligne n'est pas difficile: insérez simplement une ligne de longueur velocity.length dans le graphique. Cela met la ligne centrée sur le point dans la direction de l'axe des y. Nous devons obtenir cela maintenant dans la rotation et la traduction appropriées.

Le vecteur de translation n’est pas difficile à calculer: c’est la moitié du vecteur de vitesse. La matrice de rotation, cependant, m'est extrêmement difficile à atteindre. Étant donné un vecteur directionnel <x, y, z>, de quelle matrice ai-je besoin?

Modifier 1: Rechercher; Si vous ne comprenez pas la question, vous ne pourrez probablement pas me donner de 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 cet 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 tourné les colonnes et les lignes pour voir s'il y a un effet.

Modifier 2:

Mes excuses pour la formulation grossière de mes commentaires.

Il semble donc y avoir eu une combinaison de deux erreurs; House MD a souligné (nom très incorrect des variables: vec_z était en fait vec_y, etc.), et le second était que je devais inverser la matrice avant de la transmettre au moteur de rendu (transposition Fermer!). Le code modifié est donc:

                    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();
Était-ce utile?

La solution

Dupe.

  

La question ici consiste à obtenir une rotation sur un certain axe, alors que je suis préoccupé par l’obtention d’une matrice de rotation.

Eh bien, je me demande si vous pourriez activer convertir l'un en l'autre ?

BTW, votre solution actuelle consistant à choisir un axe y arbitraire et à la réorthogonaliser devrait fonctionner correctement; il semble cependant bogué, ou du moins mal écrit. 'z_vec' n'est pas un bon nom de variable pour l'axe des ordonnées. Qu'est-ce qui se passe avec l'ordre 'z, x, y', de toute façon?

Si cela ne fonctionne toujours pas, essayez d’apporter des modifications aléatoires jusqu’à atteindre: transposez la matrice, annulez les vecteurs jusqu’à ce que vous ayez un nombre pair d’erreurs de signe, ce genre de chose.

De plus, votre ton de voix semble être impoli, étant donné que vous demandez à des étrangers de passer leur temps à vous aider.

Autres conseils

Cela devrait vous intéresser

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top