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

OpenGL Discussion :

formules mathematiques de rotation dans l'espace


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut formules mathematiques de rotation dans l'espace
    bonjour à tous,

    je cherche depuis longtemps, une réponse à cette question,
    j'ai posé cette question sur plusieurs sites et je n'ai pas de réponse.

    je cherche les formules mathematiques pour faire des rotations dans l'espace

    un centre c(0,0,0) d'un objet

    un point p(-1,1,-1) de l'objet

    repère orthogonal


    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
    ------------------------/-z
     
     
    ----------/p
     
     
    .......................-y vue dessous
    /-x_________________c centre_______________/x
    .......................+y vue dessus
     
     
     
     
     
    ------------------------/+z
    1)

    formule mathematique pour une rotation du point p par rapport au centre c
    sur l'axe y
    formule mathematique pour une rotation du point p par rapport au centre c
    sur l'axe x
    formule mathematique pour une rotation du point p par rapport au centre c
    sur l'axe z

    2)

    formule mathematique pour une rotation du point p par rapport à l'axe -y+y
    sur l'axe y
    formule mathematique pour une rotation du point p par rapport à l'axe -x+x
    sur l'axe x
    formule mathematique pour une rotation du point p par rapport à l'axe -z+z
    sur l'axe z

    je ne sais pas si je m'explique bien

    exemple

    si rotation du point p par rapport au centre c sur l'axe x

    les coordonnées du point p varie

    p(px,py,pz)

    px varie
    py varie
    pz varie

    par contre

    si rotation du point p par rapport à l'axe -x+x, sur l'axe x

    les coordonnées du point p varie

    p(px,py,pz)

    py varie
    pz varie

    mais la coordonnées px ne varie pas

    en effet, un objet ( exemple => rectangle ), les rotations, sur l'axe x, ou y, ou z par rapport au centre de cet objet les formules mathématiques sont différentes que lors d'une rotation sur l'axe x, ou l'axe y, ou l'axe z, par rapport à
    un axe -z +z pour une rotation sur l'axe z
    un axe -y +y pour une rotation sur l'axe y
    un axe -x +x pour une rotation sur l'axe x

    j'aimerais connaitre les formules pour chaque cas
    sur internet j'ai vu des formules de rotations avec une matrice de rotation
    mais je ne sais pas si c'est une rotation par rapport au centre ou par rapport aux axes -x+x -y+y -z+z

    voici les formules


    # voila ce code n'a rien d'extraordinaire, il n'affiche qu'un cube en rotation,
    # mais son utilité principale est la suivante :
    # A partir d'un point dans un repere 3D, on applique une rotation de centre O(Origine) sur les 3 axes,
    # et on retrouve les coordonées du point.

    # Ce code va, dans mon cas, servir pour un moteur physique (gestion chute des objets etc...)

    # j'ai mis dans le projet un exemple d'un cube qui illustre la fonction principale.
    # Vous passez en parametre a cette fonction, les coordonnées du point, les rotations, et elle retourne
    # les nouvelles coordonnées.

    # En fait c'est juste une matrice de rotation appliquée aux coordonnées du point.
    # je remercie par ailleur VBLover pour ses conseils sur le forum



    # La matrice est :
    # Cos(Z)Cos(Y) Sin(Z)Cos(X)-Cos(Z)Sin(Y)Sin(X) Sin(Z)Sin(X)+Cos(Z)Sin(Y)Cos(X)
    # -Sin(Z)Cos(Y) Cos(Z)Cos(X)+Sin(Z)Sin(Y)Sin(X) Cos(Z)Sin(X)-Sin(Z)Sin(Y)Sin(X)
    # -Sin(Y) -Cos(Y)Sin(X) Cos(Y)Cos(X)
    # Et la fonction de transformation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Private Type PointType
    X As Double
    Y As Double
    Z As Double
    End Type
     
    Private Function rotate(Point As PointType, R As PointType) As PointType
    rotate.X = Point.X * (Cos(R.Z) * Cos(R.Y)) + Point.Y * (Sin(R.Z) * Cos(R.X) - Cos(R.Z) * Sin(R.Y) * Sin(R.X)) + Point.Z * (Sin(R.Z) * Sin(R.X) + Cos(R.Z) * Sin(R.Y) * Cos(R.X))
    rotate.Y = Point.X * (-Sin(R.Z) * Cos(R.Y)) + Point.Y * (Cos(R.Z) * Cos(R.X) + Sin(R.Z) * Sin(R.Y) * Sin(R.X)) + Point.Z * (Cos(R.Z) * Sin(R.X) + Sin(R.Z) * Sin(R.Y) * Cos(R.X))
    rotate.Z = Point.X * (-Sin(R.Y)) + Point.Y * (-Cos(R.Y) * Sin(R.X)) + Point.Z * (Cos(R.Y) * Cos(R.X))
    End Function
    j'ai utilisé ces formules avec le VRML cela ne marche pas.
    maintenant je commence à apprendre le C, j'ai choisi la bibliothéque SDL pour la gestion des événements et des fenêtres, et OpenGL pour la 3D.

    et j'aimerais arriver à connaitre la position x,y,z d'un point faisant parti d'un objet o qui est à une distance dx,dy,dz de son centre c quelque soit les angles de rotation de l'objet dont le centre est c.

    sachant que les rotaions se font soit par rapport à un axe ou soit par rapport au centre de l'objet.

    si vous avez les formules
    ou une adresse internet d'un cour de mathematique assez clair

    merci d'avance

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 399
    Par défaut
    Salut, la matrice de rotation autour d'un axe arbitraire s'écrit ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    |   c + (1 - c) * x²           (1 - c)* x * y - s * z      (1 - c) * x * z + s * y  | 
    |   (1 - c) * x * y + s * z    c + (1 - c) * y²            (1 - c) * y * z - s * x  | 
    |   (1 - c) * x * z - s * y    (1 - c) * y * z + s * x     c + (1 - c) * z²         |
    avec :
    (x,y,z) l'axe de rotation normalisé
    c le cosinus de l'angle de rotation
    s le sinus de l'angle de rotation

    Pour faire une rotation autour d'un point autre que l'origine, il faut la multiplier par une matrice de translation. Pour ce faire il faut d'abord passer en coordonnées homogène (une matrice 4x4)
    SPARK
    Moteur de particule C++ opensource avec modules de rendu OpenGL, Irrlicht et SFML

  3. #3
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 580
    Par défaut
    Avant deposer la question sur le forum, tu as pensé à regarder les FAQs
    Où trouver des réponses à mes questions de maths ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2008
    Messages : 35
    Par défaut
    merci à tous les deux pour vos réponses.

    shenron666, je ne me serais pas permis de poster ma demande si je n'avais pas fait quelques recherches avant et donc si je n'avais pas regardé ton lien et bien d'autre sur les cours de math sur les matrices ou les quaternions.
    le problème est que je ne connais pas les matrices et encore moins les quaternions, je connais juste la trigo de base.
    Si quelqu'un connait un livre sur les maths ( matrices et quaternions et autres ) qui serait plus progressif pour comprendre, je veux bien acheter et lire ce livre.

    pour frifron ou pour toi les matrices et translation de matrice sont aussi faciles pour vous que l'équation d'une droite en 2D pour moi.

    le problème n'est pas pour moi de visualiser les mouvements 3D dans ma tête, car je pense voir les mouvements et les données qui sont utilisées, mais c'est de retranscrire ceci en formules de math.

    sur internet j'ai trouvé plusieurs formules de rotation mais quand je l'applique dans le vrml pour l'instant cela ne fonctionne pas.

    1) formule 1

    Private Type PointType
    X As Double
    Y As Double
    Z As Double
    End Type

    Private Function rotate(Point As PointType, R As PointType) As PointType
    rotate.X = Point.X * (Cos(R.Z) * Cos(R.Y)) + Point.Y * (Sin(R.Z) * Cos(R.X) - Cos(R.Z) * Sin(R.Y) * Sin(R.X)) + Point.Z * (Sin(R.Z) * Sin(R.X) + Cos(R.Z) * Sin(R.Y) * Cos(R.X))
    rotate.Y = Point.X * (-Sin(R.Z) * Cos(R.Y)) + Point.Y * (Cos(R.Z) * Cos(R.X) + Sin(R.Z) * Sin(R.Y) * Sin(R.X)) + Point.Z * (Cos(R.Z) * Sin(R.X) + Sin(R.Z) * Sin(R.Y) * Cos(R.X))
    rotate.Z = Point.X * (-Sin(R.Y)) + Point.Y * (-Cos(R.Y) * Sin(R.X)) + Point.Z * (Cos(R.Y) * Cos(R.X))
    End Function

    2) formule 2

    sx = sin(A) # Setup - une seule fois
    cx = cos(A)
    sy = sin(B)
    cy = cos(B)
    sz = sin(C)
    cz = cos(C)

    x1 = x * cz + y * sz # Rotation de chaque vertex
    y1 = y * cz - x * sz
    z1 = z

    x2 = x1 * cy + z1 * sy
    y2 = z1
    z2 = z1 * cy - x1 * sy

    x3 = x2
    y3 = y2 * cx + z1 * sx
    z3 = z2 * cx - x1 * sx

    3) formule 3

    var p1x = px * (Math.cos(C) * Math.cos(B)) + py * (Math.sin(C) * Math.cos(A) - Math.cos(C) * Math.sin(B) * Math.sin(A)) + pz * (Math.sin(C) * Math.sin(A) + Math.cos(C) * Math.sin(B) * Math.cos(A));
    // var p1y = px * (-Math.sin(C) * Math.cos(B)) + py * (Math.cos(C) * Math.cos(A) + Math.sin(C) * Math.sin(B) * Math.sin(A)) + pz * (Math.cos(C) * Math.sin(A) + Math.sin(C) * Math.sin(B) * Math.cos(A));
    // var p1z = px * (-Math.sin(B)) + py * (-Math.cos(B) * Math.sin(A)) + pz * (Math.cos(B) * Math.cos(A));

    // sortie_nom_script_nom_objet_point_avant_gauche_haut = new SFVec3f(p1x,p1y,p1z);


    4) formule 4


    // var p1x = px * ( Math.sin(B) * Math.sin(A) * Math.sin(C) + Math.cos(B) * Math.cos(C) ) + py * ( Math.cos(A) * Math.sin(C) ) + pz * ( Math.sin(B) * Math.cos(C) - Math.cos(B) * Math.sin(A) * Math.sin(C) );
    // var p1y = px * ( Math.sin(B) * Math.sin(A) * Math.cos(C) - Math.cos(B) * Math.sin(C) ) + py * ( Math.cos(A) * Math.cos(C) ) + pz * ( -Math.cos(B) * Math.sin(A) * Math.cos(C) - Math.sin(B) * Math.sin(C) );
    // var p1z = px * ( -Math.sin(B) * Math.cos(A) ) + py * ( Math.sin(A) ) + pz * (Math.cos(B) * Math.cos(A));

    voila toutes les formules que j'ai trouvé et elles ne fonctionnent pas

Discussions similaires

  1. rotation d'un point dans l'espace
    Par ded jay dans le forum C++
    Réponses: 7
    Dernier message: 16/10/2007, 10h46
  2. Rotation dans l'espace
    Par benjaminM dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 25/05/2007, 16h12
  3. 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
  4. [Math]Valider une formule mathematique en java
    Par RolandB dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 22/04/2005, 09h09
  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