Author Topic: Migration d'un squelette  (Read 7054 times)

0 Members and 1 Guest are viewing this topic.

ougalougou

  • Thug
  • *
  • Posts: 18
Migration d'un squelette
« on: November 27, 2005, 12:16:00 AM »
Salut, le projet que je mettrais en place est de migrer un squelette construit sur Truespace vers Hyperion.Puis dans un futur proche de pouvoir animer mes personnages.

J'enregistre le format d'animation sous Truespace au format "Objet animation *.can" puis grace à une routine en Lua j'affiche pour l'instant les joints dans Truespace.Je posterais bientot le code source.
Mais si vous connaissez un logiciel qui exporte plus de données comme les types de joints renseignez moi.
A bientôt!!

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2357
    • oZone3D.Net
Migration d'un squelette
« Reply #1 on: November 27, 2005, 11:51:25 AM »
Hello ougalougou, content de te revoir  :D

Quand tu dis que tu affiches les joints dans Truspace avec LUA, tu ne voudrais pas plutot dire que tu les affiches dans hyperion ?

Tu peux faire voir le contenu d'un fichier *.can?

ougalougou

  • Thug
  • *
  • Posts: 18
Migration d'un squelette
« Reply #2 on: November 27, 2005, 02:13:55 PM »
Oui,j'affiche les joints dans hyperion mais je les positionnent d'abord dans Truespace pour récupérer les données intéressantes.Voilà la code source qui est aussi très didactique pour maîtriser le langage LUA.
http://perso.wanadoo.fr/d.ovar/hyperion/demos/squelette/animation.zip
http://perso.wanadoo.fr/d.ovar/hyperion/demos/squelette/animation.zip

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2357
    • oZone3D.Net
Migration d'un squelette
« Reply #3 on: November 27, 2005, 08:26:52 PM »
Beau code lua pour parser le fichier can!

Les matrices de transformation contenues dans le fichier can sont les matrices de transformation relatives?

Je pense que ca doit être le cas car le fichier can definie une hiérarchie dont le parent est "Bone". Le premier enfant est "HingeJoint" et ainsi de suite. Je te suggère de regarder du coté des fonctions HYP_Object.AddChild() pour construire la hiérarchie.

J'ai ajouté une nouvelle fonction dans la host api lua, HYP_GetBaseDir(), qui permet de récupérer le répertoire de base du script xml principal de la demo. Grace à cette fonction, on pourra ouvrir correctement les fichiers dans lua:

Code: [Select]

file = io.open( HYP_GetBaseDir() .. "/squelette.can","r");


Cette fonction sera dispo dans la version 1.0.4...

ougalougou

  • Thug
  • *
  • Posts: 18
Squeletor version 0.2
« Reply #4 on: November 30, 2005, 04:29:12 PM »
J'ai juste implémenter le hiéarchie Parent -enfants pour le squelette.
Prochainement ,je réaliserai une représentation plus réaliste du squelette et commencerai à réaliser une interface pour animer les joints(enfin je me replonge dans les math avec les matrices).
A++ (Lua et Hyperion c'est trop puissant!!)
Telechargement des sources:
http://perso.wanadoo.fr/d.ovar/hyperion/demos/squelette/animation.zip
http://perso.wanadoo.fr/d.ovar/hyperion/demos/squelette/animation.zip

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2357
    • oZone3D.Net
Migration d'un squelette
« Reply #5 on: December 01, 2005, 02:57:20 PM »
Je viens de regarder les nouvelles sources et ça avance bien!
Le code lua devient de + en + complexe. C'est bien tout ça, c'est bien!

ougalougou

  • Thug
  • *
  • Posts: 18
Mise en forme du squelette
« Reply #6 on: December 03, 2005, 11:31:49 PM »
Je progresse et j'ai formalisé le squelette dont voici une capture:

La légende est:
En bleu : les joints
En gris le centre des os
En blanc : les os
En violet : les extrémités des os  :shock:

ougalougou

  • Thug
  • *
  • Posts: 18
Finalisation Hiérarchie
« Reply #7 on: December 10, 2005, 07:20:13 PM »
Voilà ,vous pouvez animer le squelette
Les touches sont :
[SHIFT]+CLICK-GAUCHE pour sélectionner un joint
puis K,M,O et P pour faire des rotations
 :P
Le code source est à la même adresse:
http://perso.wanadoo.fr/d.ovar/hyperion/demos/squelette/animation.zip
Il reste quelques imperfections pour le squelette mais je continue mon objectif qui est d'animer une créature en passant à l'étape qui est d'associer une mesh au squelette et au choix du meilleur algorithme :?:

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2357
    • oZone3D.Net
Migration d'un squelette
« Reply #8 on: December 11, 2005, 01:06:06 PM »
C'est sympa de pouvoir sélectionner un joint et ensuite de lui appliquer une rotation.

Un conseil: effectue tes rotations par rapport au temps. Recupère le dt de la derniere frame et utilise comme facteur dans les fonctions de rotation. Exemple:

Code: [Select]

time_step = HYP_GetTimeStep();
HYP_Object.SetYaw( mesh_name, -50.0 * time_step );


où 50.0 est la vitesse de rotation en degrés par seconde. Et là, quelque soit la vitesse de la machine, les rotations seront identiques...

A ce propos il y a une faute dans la doc: HYP_GetTimeStep permet de récupérer le temps écoulé en secondes ET NON en millisecondes. Je vire cette coquille.

Vivement la suite  :D

ougalougou

  • Thug
  • *
  • Posts: 18
LA THEORIE
« Reply #9 on: December 14, 2005, 04:48:44 AM »
Maintenant que le squelette est réalisé ,tout est de savoir comment il va agir sur le corps ou mesh.Donc voici une théorie que je vous présente et qui me parait réalisable.Un petit schéma pour tout comprendre:

Le point A est un point de la mesh dont je cherche à savoir s'il est influençable par l'os en rouge.Cela revient à savoir s'il appartient à l'intérieur   de l'ellipse  non plein en pointillé.Le centre H de cet ellipse est le projeté orthogonal du point A sur l'axe en rouge.Maintenant il faut déterminer le grand rayon Ra et le petit rayon Rb.Bon je ne vais pas rentrer dans les détails mathématiques mais on peut déjà dire que le rayon Ra est proportionel à la longueur O1O ( O1 centre de l'ellipse de rayon Ra1 et Rb1, O centre de l'ellipse Ra , Rb ) ,de même Rb est proportionnel à cet même hauteur.
Bon je pense que je suis allé à l'essentiel.Tous les commentaires sont les biens venus!!!! :idea:
Remarque: La zone de turbulence pour le mesh est représenté par le cone coupé :shock:

ougalougou

  • Thug
  • *
  • Posts: 18
AUTRE THEORIE
« Reply #10 on: December 14, 2005, 03:11:57 PM »
L'autre theorie qui me semble plus simple , est d'associe à chaque points du mesh ,l'os le plus proche en terme de distance ( Mathématiquement cela revient à calculer la distance d'un point à une droite)  :idea:

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2357
    • oZone3D.Net
Migration d'un squelette
« Reply #11 on: December 14, 2005, 06:13:59 PM »
En fait tu t'attaques maintenant au skinning. Je pense que la seconde théorie est la plus proche de ce qui se fait en pratique, à savoir le calcul du poids d'un bone par rapport à un vertex. Et c'est exactement un calcul de distance entre un segment et un point.

Je ne me suis pas encore attaqué directement au problème mais d'après un des books qui trainent dans le cache L2 de mon desk, une façon de calculer le poids associé à un vertex est :

Code: [Select]

weight = k / pow(distance, n);


où k et n valenmt respectivement 1 et 4 pour une animation de personnage.

Le principe ensuite est de parcourir tous les bones et pour chaque bone de parcourir tous les vertices et de stacker les transformations. Le poids agit comme un facteur de scaling dans le resultat final.
Pour accélérer les calculs, si le poids est inférieur à un certain seuil, tu peux laisser tomber le bone courant et passer au suivant.

A mon avis il ne manque pas grand chose pour avoir une anim de perso complete  :D