IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Géometrie dans l'espace


Sujet :

Algorithmes et structures de données

  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut Géometrie dans l'espace
    Bonjour !

    Je programme avec JAVA3D, et la maniere dont on place les objets est assez spéciale.

    En effet, on crée un objet qui sera en (0,0,0) puis on y applique des translations et des rotations.

    Mon problème est le suivant :
    Je désire crée un cylindre qui va rejoindre deux sphères, mais forcement, ca fait n'importe quoi

    Voici comment j'ai procédé :

    Je récupère deux triplets correspondant aux coordonnées des deux spheres : disons S1 et S2

    Je calcule la distance entre les deux spheres avec le pythagore classique pour donner une longueure au cylindre: racine(carré(x2-x1)+carré(y2-y1)+carré(z2-z1))
    Jusqu'a la tout va bien

    Je dois maintenant trouver des rotations de l'objet pour qu'il soit correctement aligné.
    J'ai donc décidé, pour simplifier , de découper la rotation en deux rotations, selon le plan XY, puis selon le plan XZ.

    Je fais donc angleXY = arc Cos ( x2-x1/ distanceXY ) ou j'ai calculé distanceXY auparavant (x2-x1 sera le coté adjacent a l'angle, et distanceXY sera l'hypothenuse )
    Et pareil pour angle XY

    Et la j'applique tout , et ca marche pas !!

    Quelqu'un aurait saurait pourquoi ? ou aurait une idée plus simple/efficace ?

    Je vous remercie d'avance !

  2. #2
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    En fait pour aligner ton cylindre il faut que tu aligne son axe z (ici je considère que c'est la hauteur) avec l'axe qui joint les centres des deux spheres.

    Tu construis un vecteur orthogonal à cet axe, ça va devenir ton axe x et ensuite tu construis l'axe y en prenant le produit vectoriel ensuite l'axe z et l'axe x.

    Tu as donc une base orthogonale qui représente le repère local de ton cylindre. Pour effectuer la rotation, tu crée la matrice correspondante en utilisant la faq par exemple :

    http://jeux.developpez.com/faq/matquat/?page=bases#Q5

    Et ensuite, tu appliques ta rotation.

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut
    Merci, je vais essayer ca tout de suite

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut
    J'ai enfin réussi a implémenter ca avec les matrices, mais la transformation voulue n'est pas obtenue. J'obtiens une sorte de galette. Donc deja ca veut dire que mes translations sont pas bonnes et que la rotation nonplus car sinon je devrais plutot avoir une sphere....

    Je cherche donc l'axe qui rejoint les deux spheres
    je cree deux axes supplementaires qui forment une base orthonormée
    Je fais ensuite le produit de la matrice de mon nouvel repere par l'inverse de l'initiale, pour obtenir celle de rotation.

    Donc voici mon code, si quelqu'un pourrait me dire ce que je fais de mal ...
    MERCI !

    la Fonction prend en entrée le vecteur séparant les deux spheres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    private Matrix3f getRotMat(float[] coordVect){
     
    	// calcul du vecteur directeur de l'axe ZPrim
     
    	Vector3f zPrim = new Vector3f (coordVect[0], coordVect[1], coordVect[2]);
    	zPrim.normalize();
     
    	// Calcul d'un vecteur orthogonal : YPrim
    	Vector3f yPrim = new Vector3f (1/coordVect[0], 1/coordVect[1], -2/coordVect[1]);
    	yPrim.normalize();
     
    	// Calcul d'un vecteur orthogonal aux deux precedents
    	Vector3f xPrim = new Vector3f();
    	xPrim.cross(zPrim, yPrim);
    	xPrim.normalize();
     
    	//Matrice initiale inversée 
    	Matrix3f matInit = new Matrix3f ();
    	matInit.setIdentity();
    	matInit.invert();		
     
    	// Matrice de la base PRIM 
    	Matrix3f matRot = new Matrix3f();
    	matRot.setColumn(0, xPrim);
    	matRot.setColumn(1, yPrim);
    	matRot.setColumn(2, zPrim);
     
    	// Multiplication des deux matrices
    	matRot.mul(matInit);
     
    	return matRot;
    }
    }

  5. #5
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    J'ai enfin réussi a implémenter ca avec les matrices, mais la transformation voulue n'est pas obtenue. J'obtiens une sorte de galette. Donc deja ca veut dire que mes translations sont pas bonnes et que la rotation nonplus car sinon je devrais plutot avoir une sphere....
    Je comprend pas bien, tu as ta géométrie, la matrice de rotation conserve les distances, si tu as un cylindre au début, à la fin du devrait avoir un cylindre et pas une sphere ...

    Je fais ensuite le produit de la matrice de mon nouvel repere par l'inverse de l'initiale, pour obtenir celle de rotation.
    Pourquoi tu inverses la matrice ?

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut
    Oui , excuse moi je me suis mal expliqué

    En fait, je rejoins une centaine de spheres par plein de cylindres
    Comme je n'effectue pas les translations ( je fais ca pour des tests) , logiquement, tout les cylindres devraient se supperposer. Etant donné qu'il y a de fortes chances que la distribution angulaire soit homogène, cette supperposition devrait former une sphere.

    J'ai aussi ecrit que j'ai réussi a l'implémenter, mais je voulais dire que j'ai réussi a comprendre la logique, mais le prog marche toujours pas

  7. #7
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut Autre Approche
    Vu que je dois rendre ca pour Lundi, vu que ca ne marchait pas, j'ai tenté une nouvelle approche, sans passer par les matrices.
    Ca marche "plutot" bien , mais c'est ca qui est étonnant.
    Certains atomes sont parfaitement reliés, tandis que d'autres font n'importe quoi...

    Selon moi, l'erreur proviens du fait que je suis nul en trigo . Y doit falloir faire un plus PI ,un moins PI/2 ou un truc dans le genre. Mais quoi ? J'ai essayé plein de possibilités a la bourrin ( je sais , c nul ) mais j'y arrive toujours pas...

    Voici mes fonctions qui déterminent la rotation selon un axe :
    - getXAngle donne l'angle de rotation , il est obtenu en faisant la fonction inverse de la tangente (z/y)
    -getZAngle : pareil avec (x/y)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private float getXAngle(Vector3f vectA){
    		float angleX = (float)Math.atan(vectA.z/vectA.y);
    		System.out.println("Angle X = "+ angleX);
    		return angleX+(float)Math.PI;  ////// Décalage de Pi 
    	}
     
    	private float getZAngle(Vector3f vectA){
    		float angleZ = (float)Math.atan(vectA.x/vectA.y);
    		System.out.println("Angle Z = "+ angleZ);
    		return -angleZ+(float)Math.PI;
    	}
    Merci Beaucoup !!

  8. #8
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Et pourquoi pas tout simplement tracer un segment (assez gros en epaisseur) entre le centre de tes spheres ?

  9. #9
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut
    Effectivement, ce serait beaucoup plus simple !
    Mais Java3D ne le permet pas ... (enfin j'ai rien trouvé qui le permet)
    Le projet impose le choix de JAVA3D , sinon j'aurais deja change !!

    C'est dommage de n'avoir pas implémenté une telle fonction car ca simplifierai beaucoup les choses !

  10. #10
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut
    HAHA !!

    Je t'adores et je te hais

    Effectivement , il est bien possible de créer des lignes directement aux coordonnées voulues ....

    Ca veut dire que j'ai perdu environ deux jours a essayer de relier les spheres pour rien ...

    Au moins j'aurais appris comment marchent les rotations avec les matrices et sans !!!!

    Merci beaucoup !!

  11. #11
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Je ne suis vraiment pas un spécialiste de java (même pas un utilisateur) mais ça me paraissait bizarre, j'ai rapidement regardé la doc et j'ai trouvé la classe
    LineAttributes qui te permet de choisir différents paramètres dont la largeur du segment de droite que tu veux afficher, ça me parait un bon truc !

  12. #12
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 57
    Par défaut Mais quand meme :)
    Je suis en train d'essayer d'implémenter ca avec les lignes, mais j'aimerais quand meme savoir si quelqu'un sait d'ou venait le problème.
    En effet, j'étais tres proche du but, yavait juste une petite erreur dans les angles. De plus, ca me permettrai de fournir un autre mode de visualisation .

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Géometrie dans l'espace
    Par Dark-Water dans le forum Développement 2D, 3D et Jeux
    Réponses: 3
    Dernier message: 03/07/2006, 17h27
  2. linker 2 projets inclus dans un espace de travail
    Par petdelascar dans le forum C
    Réponses: 2
    Dernier message: 12/01/2006, 20h02
  3. Problème d'équations dans l'espace (perspective -> 3D)
    Par Rémiz dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/12/2005, 17h43
  4. rotations dans l'espace -validation d'un modèle mathématique
    Par khayyam90 dans le forum Mathématiques
    Réponses: 20
    Dernier message: 16/08/2005, 13h26
  5. Découpage dun string dans l'espace
    Par Clad3 dans le forum OpenGL
    Réponses: 4
    Dernier message: 24/03/2005, 17h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo