Jeux Libres

Envie de créer un jeu vidéo ?   Le site qui vous accompagne de A à Z.


» Les Forums » A propos de la création de jeux vidéo » Les quaternions


Aller à la page : 1.

Les quaternions
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. ^^
  Profil Mail
 


Aller à la page : 1.


Hébergeur du site : 1and1.fr



Site de création de Jeux Vidéo
Apprenez à créer vos propres Jeux Video

1198814 pages ont été consultées sur le site !
Dont 2322 pages pendant les 24 dernières heures.

Page générée en 0.303 secondes


Nos partenaires
- Otium Production : Aide aux débutants à créer leurs jeux
- Les bibliothèques de développement de jeux vidéo


  © 2005-2012 www.jeux-libres.com - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.