|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre confirmé
![]() Thomas PegotÉtudiant Inscription : janvier 2012 Messages : 195 ![]() |
Bonjour,
Mon programme est issue d'un TP modélisation par skinning. Pour le moment on a quelques bones reliés et effectuant une rotation. Je viens de rajouter un repère lié à chaque bones avec la fonction display_axes. J'ai fais des erreurs sur la création des axes du repères. J'aimerai donc que vous me dîtes ce qui ne va pas, et me dire par quoi remplacer. Code :
|
||
|
00
|
|
|
#2 |
|
Futur Membre du Club
![]() sara sellosInscription : juin 2006 Messages : 46 ![]() |
Bonjour,
serait -il possible de transmettre tous les fichiers sources (.h, autres classes?) ton problème est un problème purement mathématiques mais ce serait plus facile de t'aider si on pouvait voir ce que ca donne et "tracer" pourrais tu expliquer où tu souhaites dessiner ton repère ? à position ou à position local? |
|
|
00
|
|
|
#3 | |
|
Membre confirmé
![]() Thomas PegotÉtudiant Inscription : janvier 2012 Messages : 195 ![]() |
Cette fonction est lancée dans la fonction qui actualise les nouvelles positions des bones :
Citation:
En fait j'utilise le repère global pour positionner le centre du repère sur chaque bones: Et pour l'orientation des vecteurs du repère j'utilise la position local: A partir de là j'ai un axe de juste. Le problème c'est de trouver les autres axes pour former une base orthogonale. J'utilise donc un produit vectoriel par exemple pour trouver le dernier. Mais finalement c'est le second qui pose problème. Je n'ai pas d'idée pour le trouver. J'ai utilisé l'orientation mais ça n'a aucun rapport... |
|
|
00
|
|
|
#4 |
|
Futur Membre du Club
![]() sara sellosInscription : juin 2006 Messages : 46 ![]() |
Bonsoir
merci pour ces compléments d'info! je comprends un peu mieux tu as donc trouver le premier vecteur de ton repère, c'est déjà bien! pour formé une base othornomé à partir de ce vecteur, la démarche est la suivante : il faut déjà trouver un vecteur perpendiculaire à ce premier vecteur (et le normaliser) ensuite, pour trouver le dernier vecteur, il suffit simplement de faire le produit vectoriel du premier vecteur par le second notons v1 ton premier vecteur v1(x1,y1,z1) Soit v2( x2,y2,z2) un vecteur perpendiculaire à v1 alors le produit scalaire entre les 2 est nul x1.x2 + y1.y2 + z1.z2 = 0 Tu peux "forcer" à 0 certaines coordonnées pour résoudre le système Différents cas sont néamoins à considérer: si x1 = 0, y1 = 0, z1 = 0, on a le vecteur nul, donc il y a une erreur qq part ![]() si x1 = 0 et y1 = 0, tu peux prendre n'importe quelle valeur pour x2 et y2 à condition de mettre z2 à zéro si x1 = 0 et z1 = 0, tu peux prendre n'importe quelle valeur pour x2 et z2 à condition de mettre y2 à zéro si y1 = 0 et z1 = 0, tu peux prendre n'importe quelle valeur pour y2 et z2 à condition de mettre x2 à zéro enfin si aucune coordonnées de v1 est nulle, tu peux mettre par ex z2 = 0 donc tu te retrouves à résoudre x1.x2 + y1.y2 = 0 donc x2/y2 = -y1/x1 et si tu forces y2 à 1, tu trouves x2 = -y1/x1. Une fois que tu as normalisé v2, tu calcules le produit vectoriel de v1 et v2 pour obtenir les coordonnées de v3! |
|
|
00
|
|
|
#5 | ||||||
|
Membre confirmé
![]() Thomas PegotÉtudiant Inscription : janvier 2012 Messages : 195 ![]() |
Merci sa fonctionne!!
![]() Mais pas dans tous les cas comme tu l'as expliqué. Il faut mettre plein de condition par ra rapport au repère global. J'ai trouvé plus simple en utilisant directement les quaternion: Code :
Code :
Dans ce cas plus de problème de cas au limite. Maintenant que le plus facile est fait, il reste la partie skinning que je suis en train de commencer. Pas très générique tout ça mais voila un début: Création de cylindre sur chaque os: Code :
|
||||||
|
00
|
|
|
#6 | |
|
Membre Expert
![]() ![]() Vincent BourdierIngénieur développement en 3D temps réel Inscription : mars 2007 Messages : 829 ![]() |
Citation:
(idealement tu complete ta méthode de création de cylindre avec en parametres les transformations a appliquer, comme ça tu peux apeller la méthode sur chaque bones facilement.
__________________
"le langage C permet de tout faire, y compris se tirer dans le pied. Le langage C++ permet de tout faire, y compris se tirer dans le pied - et réutiliser la balle" Ange3d.developpez.com - tutos OpenSceneGraph Ni ma boite de MP ni ma page de profil ne sont des extensions du forum OpenSceneGraph ! Merci. |
|
|
00
|
|
|
#7 | ||||
|
Membre confirmé
![]() Thomas PegotÉtudiant Inscription : janvier 2012 Messages : 195 ![]() |
C'est bon j'ai fait les bonnes transformation: du vrai skinning rigide.
Il reste maintenant des erreurs sur l'affichage : Code :
J'ai voulu par la suite changer l'affichage immédiat en créant et appelant cette fonction: Code :
Est-ce que vous pouvez m'éclairer? PS: gDEBugger plante (erreur de segmentation non résolue). |
||||
|
00
|
|
|
#8 |
|
Membre confirmé
![]() Thomas PegotÉtudiant Inscription : janvier 2012 Messages : 195 ![]() |
Voila le problème d'affichage est résolue. J'ai donc pu afficher la triangulation.
Il me reste plus qu'a réaliser la partie skinning lisse. |
|
00
|
|
|
#9 |
|
Membre confirmé
![]() Thomas PegotÉtudiant Inscription : janvier 2012 Messages : 195 ![]() |
C'est bon pour le skinning souple !
Merci pour votre aide
|
|
00
|
Copyright © 2000-2012 - www.developpez.com