J'ai un programme que je construis en 3D.Rotations de quaternion basées sur le vecteur et le point
Il est fondamentalement fait d'un objet (une sorte de cube) que les utilisateurs peuvent faire pivoter et se déplacer, tandis que je peux regarder leur vue de l'objet en inspectant le même objet sur le serveur avec une flèche dirigée vers leur point de vue.
Le client envoie son emplacement, sa direction et le haut comme 3 vecteurs au serveur. J'essaye de rendre ma flèche basée sur leur emplacement et leur rotation.
Je fais cela avec le code suivant (en utilisant LibGDX
pour la 3D):
Vector3[] vs;
Vector3 tmp = new Vector3();
batch.begin(wm.cam);
for (SocketWrapper s : clientAtt.keySet()) {// for every client
vs = clientAtt.get(s); // read the 3 vectors: { position, direction, up }
tmp.set(vs[2].nor());
vs[1].nor();
// arr.transform is the transform of the arrow
arr.transform.set(vs[0], new Quaternion().setFromCross(tmp.crs(Vector3.Z).nor(), vs[1]));
batch.render(arr);
}
Et c'est la définition de arr
:
arrow = new ModelBuilder().createArrow(0, 0, 0, 1, 0, 0, 0.1f, 0.1f, 5, GL20.GL_TRIANGLES, new Material(ColorAttribute.createDiffuse(Color.RED)), VertexAttributes.Usage.Position | VertexAttributes.Usage.Normal);
arr = new ModelInstance(arrow);
Si je tourne seulement autour l'axe Y, tout fonctionne, mais si j'utilise l'axe X/Z ça devient fou. J'essaye de comprendre où mes maths sont fausses et comment le réparer.
Merci.
si vous voulez exprimer une rotation: chaque fois que vous recevez une nouvelle série de vecteur vous faites comme vous avez créé un quaternion à partir de l'angle d'axe (le produit croisé que vous avez fait), puis vous devez stocker le quaternion précédent. et chaque fois que votre quaternion de transformation devrait être newQuaternion * previousQuaternion. –
Alors, quelle est votre question? – Xoppa