Lo

Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
|
| Ecrit le: 09 Jan 2010, 10:40 Message non corrigé | |
|
J'ai trouvé un truc génial pour les rotations dans l'espace plutôt que de devoir passer par les coordonnées polaires avec les rotations matricielles dont se sert openGL.
Cette technique est utilisée par pas mal de logiciels, regarder plutôt :
public class Quaternion {
private float a, b, c, d;
public Quaternion (float a, float b, float c, float d) {
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
public Quaternion additionner (Quaternion autre) {
return new Quaternion (a + autre.a, b + autre.b, c + autre.c, d + autre.d);
}
public Quaternion soustraire (Quaternion autre) {
return new Quaternion (a - autre.a, b - autre.b, c - autre.c, d - autre.d);
}
public Quaternion multiplier (Quaternion autre) {
Vec3t v1 = new Vec3t (b, c, d);
Vec3t v2 = new Vec3t (autre.b, autre.c, autre.d);
float a2 = a * autre.a - v1.produitScalaire(v2);
Vec3t r = (v2.scale(a, true, true, true).additionner(v1.scale(autre.a, true, true, true).additionner(v1.crossProduct(v2))));
return new Quaternion (a2, r.getX(), r.getY(), r.getZ());
}
public Quaternion conjuguer () {
return new Quaternion (a, -b, -c, -d);
}
public Quaternion rotation (Vec3t axe, float angle) {
if (axe.longueur() > 1)
axe = axe.normalize();
angle = (float) Math.toRadians(angle);
Quaternion q = new Quaternion ((float) Math.cos(angle / 2), (float) Math.sin(angle / 2) * axe.getX(), (float) Math.sin(angle / 2) * axe.getY(), (float) Math.sin(angle / 2) * axe.getZ());
Quaternion conjugue = q.conjuguer();
return q.multiplier(this).multiplier(conjugue);
}
public float getA() {
return a;
}
public float getB() {
return b;
}
public float getC() {
return c;
}
public float getD() {
return d;
}
public static void main (String[] args) {
Vec3t axe = new Vec3t (0, 1, 0);
float angle = 180;
Vec3t v = new Vec3t (0, 0, -1);
Quaternion q = new Quaternion (0, v.getX(), v.getY(), v.getZ());
Qu
aternion r = q.rotation(axe, angle);
Vec3t result = new Vec3t (r.b, r.c, r.d);
System.out.println(result);
}
}
Là j'ai fait une rotation de 180° du vecteur sur l'axe z autour de l'axe y et j'ai bien le vecteur opposé sur l'axe z!
Il y a juste un défaut, c'est que c'est imprécis et pour les valeurs de x et y j'ai des nombre très petits :
8.742278E-8 -5.9604645E-8 1.0
Mais je pense que ça ira, au pire je fait un arrondis.
Mais sinon je trouves ça simplement magique et génial!!!
________ Parce qu'on ne peut s'exprimer que par nos créations. ^^
|
|