java 3D - Java - Programmation
Marsh Posté le 24-05-2004 à 14:33:58
lol pour le sujet sur java 3d que j'ai écrit
Bonjour,
sujet java3D
je ne sais pas trop comment fonctionne le forum car je n'y suis jamais allée. je voudrais savoir comment placer un cylindre 3D dans l'espace 3D. Lorsque je crée un cylindre celui ci se place en (0,0,0); or moi je dispose d'un fichier ou je connais 2 points du cylindre donc je connais son vecteur directeur. J'ai trouvé la translation pour passer de un à l'autre mais pas les angles de rotations. comment faire? sinon ne peut on pas créer un cylindre en 3D a partir de 2 points et pas que du rayon je n ai pas trouvé.
Ou sinon existe t 'il une fonction qui permettent d'orienter le cylindre en fontion d'un vecteur directeur
merci
merci
Marsh Posté le 24-05-2004 à 16:57:09
Soit un peu plus clair(e).
Les deux points dont tu parles sont sur l'axe du cylindre ?
Marsh Posté le 25-05-2004 à 09:23:44
oui ce sont les centres de chaque cercle en haut et en bas du cylindre. merci
Marsh Posté le 25-05-2004 à 09:34:42
Normalement, les transformations se font d'un repère à l'autre. Tu calcule la matrice de passage des vecteurs de la nouvelle base en fonction de ceux de l'ancienne base.
Donc il faudrait pouvoir attacher une base à ton cylindre.
Mais compte tenu de sa symétrie, on doit pouvoir simplifié la matrice de passage.
Marsh Posté le 25-05-2004 à 14:30:49
pitiana a écrit : c est avec les angles d'euler? |
Si tu veux. Mes souvenirs de mécanique du solide sont loins
Marsh Posté le 25-05-2004 à 18:33:52
pascal34 a écrit : Mais compte tenu de sa symétrie, on doit pouvoir simplifié la matrice de passage. |
Ben non... ca n'a rien a voir avec la forme de l'objet que tu veux transformer... La matrice de passage, c'est les vecteurs de la nouvelle base exprimés dans l'ancienne base, c'est tout. Apres, que tu veuilles transformer un cube, un cylindre, une boule.... tout ca n'est qu'un amas de points au final.
Marsh Posté le 25-05-2004 à 19:51:10
Ace17 a écrit : Ben non... ca n'a rien a voir avec la forme de l'objet que tu veux transformer... La matrice de passage, c'est les vecteurs de la nouvelle base exprimés dans l'ancienne base, c'est tout. Apres, que tu veuilles transformer un cube, un cylindre, une boule.... tout ca n'est qu'un amas de points au final. |
Oui, mais si tu tiens compte de la symétrie du cylindre, la transformation doit pouvoir être simplifiée.
Par exemple, une rotation autour de l'axe du cylindre le laisse inchangé. donc si on associe un repère local au cylindre avec l'axe z suivant l'axe du cylindre, je pense que la matrice de passage doit être plus simple qu'une matrice de passage générique.
Marsh Posté le 25-05-2004 à 20:41:03
faut utiliser les produit scalaire, j'ai un probleme dessus aussi mais ça doit marcher:
en fait il te faut l'angle entre 2 vecteurs u(x, y, z) et v(x', y', z')
le produit scalaire u.v = x*x' + y*y' + z*z'
mais aussi u.v = ||u|| * ||v|| * cos(a)
il suffit de poser cos(a) = (x*x' + y*y' + z*z') / ||u|| * ||v||
Et de prendre l'acos de cos(a) pour avoir a...
Le probleme que j'ai est qu'il existe 2 a tel que a = acos(x) et là pour trouver le bon je sais pas trop...
l'axe de rotation entre les 2 vecteurs est simplement le produit vectoriel de u et v (par contre je sais pas si la normalisation du vecteur est necessaire ... )
Marsh Posté le 25-05-2004 à 21:15:43
pitiana a écrit : je n'ai pas de réponse....... |
Pour info quand c'est comme ça on ne crée pas de nouveaux topics, on remonte l'ancien
Marsh Posté le 25-05-2004 à 22:16:36
Je pense que c'est inutile de simplifier la matrice de passage, dans la mesure ou ca prendra du temps, alors que le temps pris par le calcul des points sera le meme ( le processeur ne verra pas la différence entre une matrice simplifiée ou pas ... )
Sylfurd >> ils sont pas un peu faux tes calculs?
cos (a) = u.v / (||u||.||v||) plutot...
Marsh Posté le 25-05-2004 à 22:21:15
Pour ton probleme, pitiana :
Soient u ton vecteur directeur de ton cylindre, v le vecteur selon lequel tu souhaite l'orienter.
Projete les deux sur le plan xOy par exemple, tu obtiens u' et v' donc, tu peux en déduire la rotation 2d d'axe z qui transforme u' en v'.
Tu projetes u' et v' sur le plan xOz, tu obtiens u'' et v'', tu peux en déduire la rotation 2d d'axe y qui transforme u'' en v''.
Tu n'a plus qu'a composer les deux rotations... et tu as transformé ton cylindre
Marsh Posté le 25-05-2004 à 23:11:24
Ace17 a écrit : Je pense que c'est inutile de simplifier la matrice de passage, dans la mesure ou ca prendra du temps, alors que le temps pris par le calcul des points sera le meme ( le processeur ne verra pas la différence entre une matrice simplifiée ou pas ... ) |
en effet j'ai pas fait gaffe j'edit
Marsh Posté le 26-05-2004 à 11:04:17
Ace17 a écrit : Pour ton probleme, pitiana : |
Tout à fait, mais faut faire gaffe à l'ordre de composition des rotations.
Y'a des exemples avec java3D de composition de rotations pour un cube.
Marsh Posté le 28-05-2004 à 11:57:39
merci a tout le monde pour vos réponses. merci a Ace 17 pour ses expliquations plus que utiles! merci
Marsh Posté le 28-05-2004 à 12:04:34
j'ai une nouvelle question pour vous maintenant que j'ai réussi à orienté le cylindre. en fait quand j'utilise la fonction angle pour trouver les angles de rotation (cela me donne l'angle entre 2 vecteurs) j'obtiens toujours un angle positif dans [0;pi] alors que moi je veux l'angle trigonométrique sinon ma rotation est des fois en sens inverse. Y a t il une fonction qui donne l'angle trigonométrique donc entre[-pi;pi] entre 2 vecteurs.
merci
Marsh Posté le 28-05-2004 à 14:22:11
float angle(Vector3f v1)
Returns the angle in radians between this vector and the vector parameter; the return value is constrained to the range [0,PI].
Marsh Posté le 28-05-2004 à 16:02:30
Fais-le toi-même.
A partir du produit scalaire, tu retrouves le cosinus.
A partir du produit vectoriel, tu retrouves le sinus.
En fonction de leurs signes respectifs, tu retrouves le quadrant du cercle trigonométrique dans lequel se situe l'angle. Ainsi tu peux apporter une correction à l'angle founi par cette méthode
Marsh Posté le 28-05-2004 à 16:39:59
En fait, en poursuivant l'étude théorique on pourrait éviter de passer par les angles...
Marsh Posté le 28-05-2004 à 17:36:22
Ca y est, j'ai trouvé.
Tu prends ton espace a 3 dimensions.
Tu as :
u : le vecteur directeur de ton cylindre non transformé,
v : le vecteur selon lequel tu veux l'orienter
(Au passage, tous les vecteurs utilisés ici sont normés)
Tu veux donc la matrice M de la rotation qui transforme u en v (on peut toujours tourner autour de v apres, mais ca ne nous gene pas, puisqu'il s'agit d'un cylindre ).
On peut des le départ déterminer l'axe de la rotation : il s'agit de la droite de vecteur directeur n = u ^ v. ( produit vectoriel ).
On peut trouver une base de l'espace en faisant n ^ u qui nous donne u'.
Bu = (u, u', n) est donc une base orthonormée directe de l'espace.
De meme, on peut aussi trouver une base de l'espace en faisant n ^ v qui nous donne v'.
Bv = (v, v', n) est donc une base orthonormée directe de l'espace.
En fait, la rotation qu'on cherche a faire, c'est la matrice de passage de Bv a Bu.
On exprime v et v' dans la base Bu ( par projection sur les axes ).
Code :
|
On a donc notre matrice :
Code :
|
Donc tout ca pour dire que dans le cas ou les rotations a faire sont suivant un des vecteurs de ta base canonique (donc quand n ca va etre x, y ou z) tu peux t'épargner d'avoir affaire à des angles. Et c'est précisément le cas! ( voir mon post plus haut ) Tu n'as donc qu'a appliquer deux fois cette méthode et composer les rotations pour avoir la rotation finale
Marsh Posté le 28-05-2004 à 18:20:12
Pour ceux qui n'auraient pas envie de se farcir toutes la théorie, voici comment calculer la matrice de rotation qui transforme u en v.
On reprend les notations/conventions du post précédent, soit :
u et v sont normés, n = u ^ v. On définit u' = n ^ u et v' = n ^ v.
La matrice M de rotation est :
M = AB
avec
|
Marsh Posté le 31-05-2004 à 19:33:52
pitiana a écrit : merci je v |
ais faire caca ?
Marsh Posté le 31-05-2004 à 20:21:41
pitiana a écrit : merci je l'ai imprimé je vais y méditer... |
Veux tu que je te rédige l'étude théorique? Ca me fera réviser...
Marsh Posté le 01-06-2004 à 09:29:22
et bien en fait je suis parti sur les angles de rotations et je vais trouver les angles graces au vecteur projeté de mon vecteur directeur sur le plan oij ainsi que du perpendiculaire de ce projeté dans le plan oij ect..je n utiliserais pas la fonction angle et pour le signe de l'angle je vais regarder le cosinus et le sinus ca me donnera le signe
c est pas comme ca?
merci en tout cas c est très sympa
Marsh Posté le 01-06-2004 à 10:30:04
j'ai une autre question je veux trouver le singne du sinus entre 2 angles c'est à dire sin(alpha) sera entre (-1,0) ou (0,1) comme ca j aurais un angle soit dans [0 pi] ou [-pi 0]. j'ai essayé d'utiliser le produit scalaire cad
sin(alpha)=norme(produit scalaire)/norme(u).norme(v)
mais ca ne me donne qu un sinus positif comment faire ace 17? ou les autres.
si quelqu un sait merci bcp
Marsh Posté le 01-06-2004 à 19:23:44
Elle est fausse ta formule...
cos(alpha) = norme(u.v) / norme(u).norme(v)
et pas sin(alpha)
Marsh Posté le 01-06-2004 à 19:27:23
Mais je te conseille vraiment de ne PAS passer par les angles. Tout ce que tu risques c'est de finir avec une division par zero, et de t'embrouiller l'esprit avec les lignes trigo alors qu'on s'en passe tres bien ici!
Marsh Posté le 06-05-2010 à 14:01:21
Bonjour,
Petit déterrage sympa pour mon premier post ici!
J'ai appliqué ces formules pour positionner des disques (Cylindre plat) perpendiculaires à des vecteurs, ca fonctionne pas trop mal sauf que j'ai l'impression que certains de ces disques subissent une modification de leur diamètre, bien que les méthodes getRadius() et getHeight() me renvoi les dimensions que j'ai affecté au cylindre.
C'est plus un souci au niveau de la rotation puisque l'apparence des cylindres est nickel lorsque j'applique uniquement la translation.
C'est comme si la perspective était respectée lors de l'affichage mais lorsque je me balade dans la scène, les cylindres éloignées au départ restent petit..
Qu'en pensez vous?
Une rotation peut-elle modifier l'aspect visuel d'un shape?
J'ai l'impression que oui puisque lors d'une erreur sur ma matrice de rotation, mes disques avaient pris une forme ovale..
Merci de votre aide.
Marsh Posté le 24-05-2004 à 13:59:14
je n'ai pas de réponse.......
quelqu'un aurait-il une idée?
merci d'avance