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();
Votre question est presque impossible à comprendre, en particulier la partie sur "la moitié du vecteur vitesse". –
Pourquoi appelez-vous vec_z.normalize deux fois, et quel est le ici? –
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. :-) –