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

Mathématiques Discussion :

Redimensionner une matrice de projection


Sujet :

Mathématiques

  1. #1
    Invité
    Invité(e)
    Par défaut Redimensionner une matrice de projection
    Salut.

    Je possède une classe camera qui contient trois matrices :

    -Avec la première matrice j'effectue une projection (orthographique ou bien perspective) mais je veux pouvoir aussi choisir l'unité et le sens des axes.

    -Avec la second matrice j'oriente ma caméra pour qu'elle regarde vers un point fixe.

    -Et la troisième matrice me permet d'appliquer des transformations à la caméra comme je le fais pour les objets, c'est à dire par exemple, faire tourner ma caméra autour d'un axe quelconque.

    Pas trop de problème pour faire cela à part pour effectuer un redimentionnement des objets (voir même un retournement des objets si je met une échelle n'égative) en projection perspective.

    En projection orthographique la méthode est simple.

    Code cpp : 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
     
    void ProjMatrix::setGlOrthoMatrix (double l, double r, double b, double t, double n, double f) {
        matrix4f.m11 = (2 * scale.x) / (r - l);
        matrix4f.m12 = 0;
        matrix4f.m13 = 0;
        matrix4f.m14 = -((r + l) / (r - l));
        matrix4f.m21 = 0;
        matrix4f.m22 = (2 * scale.y) / (t - b);
        matrix4f.m23 = 0;
        matrix4f.m24 = -((t + b) / (t - b));
        matrix4f.m31 = 0;
        matrix4f.m32 = 0;
        matrix4f.m33 = (2 * scale.z) / (f - n);
        matrix4f.m34 = -((f + n) / (f - n));
        matrix4f.m41 = 0;
        matrix4f.m42 = 0;
        matrix4f.m43 = 0;
        matrix4f.m44 = 1;
        this->l = l;
        this->r = r;
        this->b = b;
        this->t = t;
        this->n = n;
        this->f = f;
    }

    Mais en projection perspective cela est plus compliqué et je ne vois pas du tout comment faire, j'ai cherché la formule sur internet mais en vain. :/

    Code cpp : 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
     
    matrix4f.m11 = (2 * n) / (r - l);
        matrix4f.m12 = 0;
        matrix4f.m13 = (r + l) / (r - l);
        matrix4f.m14 = 0;
        matrix4f.m21 = 0;
        matrix4f.m22 = (2 * n) / (t - b);
        matrix4f.m23 = (t + b) / (t - b);
        matrix4f.m24 = 0;
        matrix4f.m31 = 0;
        matrix4f.m32 = 0;
        matrix4f.m33 = -((f + n) / (f - n));
        matrix4f.m34 = (-2 * f * n) / (f - n);
        matrix4f.m41 = 0;
        matrix4f.m42 = 0;
        matrix4f.m43 = -1;
        matrix4f.m44 = 0;
        isOrtho = false;
        this->l = l;
        this->r = r;
        this->b = b;
        this->t = t;
        this->n = n;
        this->f = f;
    Alors je ne veux pas faire de changement d'échelle dans la matrice de vue car cela me fait retourner aussi la caméra lorsque l'échelle est négative et je ne veux pas que la caméra soit retournée.
    Je voudrais juste par exemple que le coin en haut à droite de l'écran aie pour coordonnée -largeur * 0.5f et non pas -1 comme c'est le cas avec la matrice de projection perspective actuelle. :/
    Et pouvoir ainsi passez des coordonnées fenêtre en coordonnées monde et en coordonnée vue.

    Voilà donc merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bon, je me suis dis que redimensionner une matrice de projection est une mauvaise idée.

    Alors j'ai créer une 4 ème matrice, le but est de mapper les coordonnées entre -1 et 1, voici ce à quoi ressemble la matrice.

    Code cpp : 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
     
            viewport.m11 = 2.f / size.x * scale.x;
            viewport.m12 = 0.f;
            viewport.m13 = 0.f;
            viewport.m14 = -2.f * position.x / size.x - 1.f;
            viewport.m21 = 0.f;
            viewport.m22 = 2.f / size.y * scale.y;
            viewport.m23 = 0.f;
            viewport.m24 = -2.f * position.y / size.y - 1.f;
            viewport.m31 = 0.f;
            viewport.m32 = 0.f;
            viewport.m33 = 2.f / size.z * scale.z;
            viewport.m34 = -2.f * position.z / size.z - 1.f;
            viewport.m41 = 0.f;
            viewport.m42 = 0.f;
            viewport.m43 = 0.f;
            viewport.m44 = 1.f;
            viewportUpdated = false;

    La caméra possède donc un viewport (ou bien un frustrum) je ne sais pas quel terme je dois employé exactement qui permet de passer des coordonnées caméra (ça peut être n'importe quoi mais disons que je les définis par exemple de -300 à 300 pour x, de -400 à 400 pour y et de 0 à zFar pour z, je veux multiplier les coordonnées des points par cette matrice pour passer des coordonnées caméra en coordonnée normalisées (entre -1 et 1) avant d'effectuer la projection.

    Mais cela ne donne pas ce que j'avais espérer.

    Code cpp : 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
     
     FloatRect viewport = getView().getViewport();
        glCheck(glViewport(viewport.left, viewport.top, viewport.width, viewport.height));
        // Set the projection matrix
        glCheck(glMatrixMode(GL_PROJECTION));
        glCheck(glLoadIdentity());
        float* projMatrix = getView().getProjMatrix().getGlMatrix();
        glCheck(glMultMatrixf(projMatrix));
        delete projMatrix;
        float* viewportMatrix = getView().getViewportMatrix().getGlMatrix();
        glCheck(glMultMatrixf(viewportMatrix));
        delete viewportMatrix;
        float* viewMatrix = getView().getViewMatrix().getGlMatrix();
        glCheck(glMultMatrixf(viewMatrix));
        delete viewMatrix;
        float* transformMatrix = getView().getTransformMatrix().getGlMatrix();
        glCheck(glMultMatrixf(transformMatrix));
        delete transformMatrix;
        // Go back to model-view mode
        glCheck(glMatrixMode(GL_MODELVIEW));

    En projection perspective je ne vois que la face avant du cube et pire quand je tourne la caméra le cube tourne sur lui même, bref, je sais pas du tout comment faire pour mapper correctement ça. :/

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ho, et puis zut, ça serait trop compliqué..., car il faudrait ré-multiplier les coordonnées par une autre matrice hors que opengl multiplie les matrices entre elle, en plus les coordonnées de mes sommets sont dans des vbo donc... :aïe.

    Je vais faire plus simple, faire en sorte qu'on ne puisse faire que des scale de -1 et 1 dans la matrice de projection. (Sinon c'est déformé et les rotations de la caméra ne se font plus correctement.)

    Et faire que des scale positif dans la matrice dans la matrice de transformation de la caméra ainsi, la caméra ne se retournera pas et les transformations se feront correctement.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 17/05/2014, 07h49
  2. redimensionnement d'une matrice
    Par enita dans le forum MATLAB
    Réponses: 3
    Dernier message: 17/05/2011, 17h20
  3. Réponses: 5
    Dernier message: 17/02/2011, 09h29
  4. comment créer une matrice de projection
    Par info_sara dans le forum OpenGL
    Réponses: 6
    Dernier message: 03/07/2010, 00h25
  5. Redimensionner une matrice avec "reshape"
    Par kmaniche dans le forum Images
    Réponses: 9
    Dernier message: 07/06/2006, 18h35

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