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 :

Gestion de caméra CAO


Sujet :

OpenGL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 96
    Par défaut Gestion de caméra CAO
    Bonjour

    Le logiciel sur lequel je travaille affiche des modèles 3D. Je veux gérer la caméra comme dans un logiciel de CAO.

    C'est à dire:
    - la translation est en repère caméra (les objets bougent dans un plan // à l'écran)
    - la rotation se fait autour d'un point, qui bouge avec la caméra (le centre de l'écran, à une distance fixe)

    J'arrive à obtenir une condition, ou l'autre mais jamais les deux en même temps.
    Soit je translate correctement, mais la rotation est autour du point (0, 0, 0) du modèle (avec le code ci-dessous)
    Soit la rotation est correcte, mais je translate en repère objet, et non caméra (en inversant la translation et la rotation ci-dessous)


    Voici un code simplifié (je suis en VB.NET avec OpenTK)
    Code vb : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    Private Sub Render()
     
                GL.LoadIdentity()
     
                GL.MultMatrix(lookAtMat_)
                GL.MultMatrix(transMat_)
                GL.MultMatrix(rotMat_)
     
     
                DrawModel()
     
    End Sub
     
    Private Sub ResetView()
                camPos_.X = eyeX
                camPos_.Y = avgY
                camPos_.Z = avgZ
     
                centerPos_.X = avgX
                centerPos_.Y = avgY
                centerPos_.Z = avgZ
     
                upVec_.X = 0
                upVec_.Y = 0
                upVec_.Z = 1
     
     
                lookAtMat_ = Matrix4.LookAt(camPos_, centerPos_, upVec_)
     
                transMat_ = Matrix4.Identity
                rotMat_ = Matrix4.Identity
     
    End Sub
     
    Private Sub MouseMove(...)
     
    deltaX = ...
    deltaY = ...
     
    Dim m As Matrix4
     
    if move then
     
                Matrix4.CreateTranslation(0, deltaX / 2, -deltaY / 2, m)
                transMat_ = transMat_ * m
    else
     
                Dim m1 As Matrix4 = Matrix4.CreateRotationZ(0.005 * deltaX)
                Dim m2 As Matrix4 = Matrix4.CreateRotationY(0.005 * deltaY)
                m = m1 * m2
                rotMat_ = rotMat_ * m
    end if
     
    End Sub

    Je comprends pourquoi j'obtiens ces resultats, mais je ne sais pas comment arriver à ce que je souhaite.

    Merci d'avance !

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 819
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 819
    Par défaut
    Salut,

    Citation Envoyé par remitbo Voir le message
    Soit je translate correctement, mais la rotation est autour du point (0, 0, 0) du modèle (avec le code ci-dessous)
    [...]
    Je comprends pourquoi j'obtiens ces resultats, mais je ne sais pas comment arriver à ce que je souhaite.
    Essaie d'intégrer une translation entre l'origine et le centre de rotation dans ta chaine de transformation.
    Genre:

    translation origine>centre de rotation
    rotation
    translation centre de rotation>origine
    translation camera

    comme ça, la rotation se fera autour du centre de rotation et plus autour de l'origine.

    Jète un oeil à ceci éventuellement, voir si tu peux adapter.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur
    Inscrit en
    Décembre 2006
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 96
    Par défaut
    Salut Plegat

    Merci pour ta réponse. Je vois mieux ce que je dois faire maintenant

    J'ai essayé d'implémenter ton modèle de caméra, si je ne me suis pas trop gourré, j'arrive à la transformation suivante:
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        GL.LoadIdentity()
     
        GL.Translate(-centerPos_)
        GL.MultMatrix(Matrix4.Invert(rotMat_))
        GL.Translate(Vector3.TransformVector(centerPos_ - camPos_, rotMat_))
    Là, la rotation est toujours autour de (0, 0, 0), quelque soit centerPos_ (je pense que j'annule son effet avec la 3eme transformation). J'ai du un peu me gourrer en fin de compte

    Avec une approche un peu différente, j'arrive à faire tourner le modèle autour d'un centre de rotation, et à translater le modèle dans un plan // à la caméra.
    voici la chaine de transformation (que je vais retranscrire en une matrice caméra)
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        GL.LoadIdentity()
     
        GL.Translate(centerPos_)
        GL.MultMatrix(Matrix4.Invert(rotMat_))
        GL.Translate(-centerPos_ + Vector3.TransformVector(-camPos_, rotMat_))
    et la fonction MouseMove():
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Dim diffVec As Vector3
    If move Then
        diffVec = New Vector3(-deltaX / 2, deltaY / 2, 0)
        camPos_ = camPos_ + diffVec
        'centerPos_ = centerPos_ + diffVec
    ElseIf zoom Then
        diffVec = New Vector3(0, 0, deltaY / 2)
        camPos_ = camPos_ + diffVec
        'centerPos_ = centerPos_ + diffVec
    Else   ' rotate
        Dim m1 As Matrix4 = Matrix4.CreateRotationY(-0.005 * deltaX)
        Dim m2 As Matrix4 = Matrix4.CreateRotationX(-0.005 * deltaY)
        m = m1 * m2
        rotMat_ = rotMat_ * m
    End If
    Le problème est que centerPos_ n'est pas mis à jour en fonction de la caméra (le point de rotation, doit suivre la caméra, à une distance fixe devant cette dernière)
    Si je décommente dans la fonction MouseMove(), le point de rotation suit bien la caméra, mais la translation se fait en repère modèle.
    Je ne comprends pas vraiment, je pense que la chaine de transformation est encore buggée.

Discussions similaires

  1. [OpenGL 1.x] Gestion de caméra
    Par arrakis42 dans le forum OpenGL
    Réponses: 6
    Dernier message: 22/05/2013, 01h22
  2. [C++/Opengl] Problème de gestion de caméra
    Par alex2908 dans le forum Langage
    Réponses: 1
    Dernier message: 09/04/2011, 16h39
  3. [DirectX9] Anti-aliasing + gestion caméra
    Par SteelBox dans le forum DirectX
    Réponses: 6
    Dernier message: 21/07/2005, 00h56
  4. librairie gestion de caméra
    Par Jbx 2.0b dans le forum C++
    Réponses: 1
    Dernier message: 28/02/2005, 01h10

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