Voici ma première source java, par pitié soyez indulgents.
J'ai eu beaucoup de mal à comprendre le fonctionnement de la 3D et encore plus a lier et modifier les éléments correctement.
L'idée est de créer des objets autonomes et de les lier par des points de référence
J'ai donc créé un Objet qui hérite de la classe TransformGroup et qui comporte un Behavior + une série de points de référence.
Pour créer mon personnage, je commence par créer un objet "Torse" auquel j'ajoute des sphères / cubes etc... Afin d'obtenir une forme grossièrement ressemblante.
J?ajoute à cet objet (et c'est la toute l'astuce) des points de référence 3D que je nomme "épaule droite" "épaule gauche" "cou" etc...
En suite je crée un Objet "bras" qui comporte deux points de référence "épaule" et "coude"
Ainsi de suite pour tous les membres.
Puis je lie les objets entre eux j'indique à mon objet "torse" de lier en sont point nommé "épaule droite" l'objet "bras droit" au point nommé "épaule"
Pour finir il n'y a plus qu?à faire bouger le tout en modifiant les angles X Y Z pour chaque articulation...
Conclusion :
Il n'y a presque pas de commentaires dans le code tellement il est simple
6 janv. 2007 à 21:58
30 déc. 2006 à 20:06
25 déc. 2006 à 15:48
R(R(R(Ox,∆)Oy,Ω)*R(Ox,∆)Oz,∂)*R(R(Ox,∆)Oy,Ω)*R(Ox,∆)
C'est une transformation non Eulerienne.
Ceci marche très très bien mais ne suffit pas. Pour éviter de cumuler des erreurs avec les produits successifs de quaternions, il faut TOUJOURS revenir au quaternion neutre puis recombiner les rotations axiales exprimées à partir des angles globaux. J'ai travaillé 6 mois principalement sur ce problème l'an passé, j'espère que ça pourra t'éviter pas mal de galères que j'ai moi-même connues.
25 déc. 2006 à 15:14
public void reset(){
T_Finale = new Transform3D();
T_RX = new Transform3D();
T_RY = new Transform3D();
T_RZ = new Transform3D();
}
Ecris plutôt ça :
public void reset(){
T_Finale.setIdentity();
T_RX.setIdentity();
T_RY.setIdentity();
T_RZ.setIdentity();
}
25 déc. 2006 à 15:00
public void applique(){
T_Finale.mul(T_RX);
T_Finale.mul(T_RY);
T_Finale.mul(T_RZ);
TG_Parent.setTransform(T_Finale);
}
Tu utilises des transformations eulériennes ce qui peut causer du gimbal lock (verrou de Cardan). Il faudrait plutôt utiliser des transformations non eulériennes qui sont plus faciles à exprimer en s'appuyant sur des quaternions.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.