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

3D Java Discussion :

PGE et quaternion sous JOGL


Sujet :

3D Java

  1. #1
    Membre régulier
    PGE et quaternion sous JOGL
    Bonjour

    J'essaye PGE de plegat

    http://plegat.developpez.com/tutorie...e-objets/#L5-A

    Est-il possible de récupérer la position xyz de la cam a partir du quaternion calculé sur déplacement de celle-ci.
    Je voudrait suivant la distance entre la pos de la cam et le point visé, sur un zoom, faire varier la valeur du zoom pour éviter de passer derrière l'objet.

    Merci d'avance.

  2. #2
    Expert éminent
    Bonjour,

    J'ai répondu à ton MP, je complète ici.

    Citation Envoyé par lio908 Voir le message

    Est-il possible de récupérer la position xyz de la cam a partir du quaternion calculé sur déplacement de celle-ci.
    Non. Un quaternion ne gère que la rotation. Pour le déplacement, utiliser le point de définition de la caméra "location", et y ajouter le vecteur translation "transVect".

    Citation Envoyé par lio908 Voir le message

    Je voudrait suivant la distance entre la pos de la cam et le point visé, sur un zoom, faire varier la valeur du zoom pour éviter de passer derrière l'objet.
    Il faudrait plutôt faire varier le taux de zoom en fonction de la distance entre la caméra et l'objet, et non le point visé.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre régulier
    Bonjour

    Et merci, c'est ce que je me doutais, je vais tester...

    mais ça a pas l'air d'être la bonne solution.

    Sur F12, je remets la CAM en x10,y10,z10
    sur PAGEUP, je recup l'info posCAM et j'ai

    K PosX CAMERA =10.0
    K PosY CAMERA =10.0
    K PosZ CAMERA =10.0

    puis, je me rapproche de la CAM suivant l'axe CAM et centre GC avec la fonction translateZ(1).
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public void translateZ(double tz) {
    		this.transVect.add(0, 0, tz);
    		this.updatePositionCamera(transVect);
    	}

    avec
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	public void updatePositionCamera(Vector3d v) {
    		this.positionCamera=this.positionCamera.translate(v);
    	}

    et
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        public Point3d translate(Vector3d vector) {
            Point3d temp=new Point3d();
            temp.setX(this.getX() + vector.getX());
            temp.setY(this.getY() + vector.getY());
            temp.setZ(this.getZ() + vector.getZ());
            return temp;


    mais j'ai comme position de la CAM, ceci
    K PosX CAMERA =9.999999999999998
    K PosY CAMERA =10.000000000000002
    K PosZ CAMERA =-6.320508075688771
    comme nouvelles positions

    pas top le-6...
    Donc le translateZ qui fait transVect(0,0,tz) avec tz=1, bouge qui?

  4. #4
    Expert éminent
    De mémoire, il est sensé bouger la ccaméra suivant son axe z local, donc l'axe de visée.

    Pourrais-tu afficher les valeurs de transvect avant/après ta translation de 1 suivant tz?
    Se retrouver en -6 après une translation de 1, c'est louche...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre régulier
    Bonjour
    Une question en premier SVP.
    Dans camera,

    translateY avec un double fait un transvect.add(0,ty,0)
    translateY sans parametre fait un transvect.add(0,0,1), donc avec la valeur 1 en Z.

    Il n'y a pas erreur ?

    ensuite, partant de pos CAM à x10,y10,z10
    position de transvect suite à +1 en trnaslateZ(1)
    transVect PosX AVANT =-9.992007221626409E-16
    transVect PosY AVANT=1.7763568394002505E-15
    transVect PosZ AVANT=-17.32050807568877
    transVect PosX APRES=-9.992007221626409E-16
    transVect PosY APRES=1.7763568394002505E-15
    transVect PosZ APRES=-16.32050807568877

    avec
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public void translateZ(double tz) {
    		System.out.println("transVect PosX =" + transVect.getX());
    		System.out.println("transVect PosY =" + transVect.getY());
    		System.out.println("transVect PosZ =" + transVect.getZ());
    		this.transVect.add(0, 0, tz);
    		System.out.println("transVect PosX =" + transVect.getX());
    		System.out.println("transVect PosY =" + transVect.getY());
    		System.out.println("transVect PosZ =" + transVect.getZ());


    si j'en fait un autre,(+1)
    Avant
    transVect PosX AVANT =-9.992007221626409E-16
    transVect PosY AVANT=1.7763568394002505E-15
    transVect PosZ AVANT=-16.32050807568877
    transVect PosX APRES=-9.992007221626409E-16
    transVect PosY APRES=1.7763568394002505E-15
    transVect PosZ APRES=-15.320508075688771

    si je fait du moins
    transVect PosX AVANT =-9.992007221626409E-16
    transVect PosY AVANT=1.7763568394002505E-15
    transVect PosZ AVANT=-15.320508075688771
    transVect PosX APRES=-9.992007221626409E-16
    transVect PosY APRES=1.7763568394002505E-15
    transVect PosZ APRES=-16.32050807568877


    Le rapprochement/éloignement marche, la valeur initiale de -17 est bonne:
    par rapport au centre visé(0,0,0) et a la position initiale de la CAM(10,10,10) c'est bien Racine de 300=17....

    Donc se serait lors de l'utilisation du translate avec le vecteur transvect pour convertir en coordonnées locale qui ne marche pas.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public void updatePositionCamera(Vector3d v) {
     
    		System.out.println("PosX CAMERA AVANT TRANSLATE=" + positionCamera.getX());
    		System.out.println("PosY CAMERA AVANT TRANSLATE =" + positionCamera.getY());
    		System.out.println("PosZ CAMERA AVANT TRANSLATE =" + positionCamera.getZ());
     
    		this.positionCamera = this.positionCamera.translate(v);
     
    		System.out.println("PosX CAMERA APRES TRANSLATE=" + positionCamera.getX());
    		System.out.println("PosY CAMERA APRES TRANSLATE =" + positionCamera.getY());
    		System.out.println("PosZ CAMERA APRES TRANSLATE =" + positionCamera.getZ());


    donne ça comme position de la CAM
    transVect PosX AVANT =-9.992007221626409E-16
    transVect PosY AVANT=1.7763568394002505E-15
    transVect PosZ AVANT=-17.32050807568877
    transVect PosX APRES=-9.992007221626409E-16
    transVect PosY APRES=1.7763568394002505E-15
    transVect PosZ APRES=-16.32050807568877
    PosX CAMERA AVANT TRANSLATE=10.0
    PosY CAMERA AVANT TRANSLATE =10.0
    PosZ CAMERA AVANT TRANSLATE =10.0
    PosX CAMERA APRES TRANSLATE=9.999999999999998
    PosY CAMERA APRES TRANSLATE =10.000000000000002
    PosZ CAMERA APRES TRANSLATE =-6.320508075688771

    si je me rapproche de 1
    PosX CAMERA AVANT TRANSLATE=9.999999999999998
    PosY CAMERA AVANT TRANSLATE =10.000000000000002
    PosZ CAMERA AVANT TRANSLATE =-6.320508075688771
    PosX CAMERA APRES TRANSLATE=9.999999999999996
    PosY CAMERA APRES TRANSLATE =10.000000000000004
    PosZ CAMERA APRES TRANSLATE =-21.641016151377542

    Si je recule
    PosX CAMERA AVANT TRANSLATE=9.999999999999996
    PosY CAMERA AVANT TRANSLATE =10.000000000000004
    PosZ CAMERA AVANT TRANSLATE =-21.641016151377542
    PosX CAMERA APRES TRANSLATE=9.999999999999995
    PosY CAMERA APRES TRANSLATE =10.000000000000005
    PosZ CAMERA APRES TRANSLATE =-37.96152422706631

    X et Y devraient bouger et Z bouger dans les 2 sens.

  6. #6
    Expert éminent
    Citation Envoyé par lio908 Voir le message

    Dans camera,

    translateY avec un double fait un transvect.add(0,ty,0)
    translateY sans parametre fait un transvect.add(0,0,1), donc avec la valeur 1 en Z.

    Il n'y a pas erreur ?
    Si...
    C'est d'ailleurs l'une des erreurs dont je te parlais dans le MP que je t'ai envoyé...mais ce n'est pas gênant, ça ne sert pas dans le code du tuto. Mais ce n'est pas propre...


    Citation Envoyé par lio908 Voir le message

    Le rapprochement/éloignement marche, la valeur initiale de -17 est bonne:
    par rapport au centre visé(0,0,0) et a la position initiale de la CAM(10,10,10) c'est bien Racine de 300=17....

    Donc se serait lors de l'utilisation du translate avec le vecteur transvect pour convertir en coordonnées locale qui ne marche pas.
    Citation Envoyé par plegat Voir le message

    Non. Un quaternion ne gère que la rotation. Pour le déplacement, utiliser le point de définition de la caméra "location", et y ajouter le vecteur translation "transVect".
    Là j'ai dit une bêtise... la procédure suivie est:
    - translation au centre de rotation (transCDR)
    - rotation (quatRot)
    - translation à la position caméra (transVect)

    et donc utiliser transVect pour avoir la position de la caméra ne suffit pas... je pense qu'il va falloir utiliser la matrice complète pour obtenir la position de la caméra (pas possible de seulement combiner les deux translations, on fait la rotation entre les deux).
    Tu récupères la matrice de transformation via getCameraMatrix, normalement la translation est donnée par la quatrième colonne de la matrice (à voir comment c'est stocké dans le FloatBuffer par contre..)
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com