2010-11-05 5 views
1

Je n'arrive pas à définir une matrice de projection orthographique de dimensions 4x2 avec (0,0) étant au centre, (-2, -1) étant dans le coin inférieur gauche et (2, 1) étant en haut à droite coin.Définition d'une matrice de projection orthographique?

J'utilise glutInitWindowSize(600, 300); pour initialiser la taille de la fenêtre. Dans ma fonction de remodelage, j'utilise glViewport(0, 0, w, h); pour définir la fenêtre. Toujours dans ma fonction remodeler, j'utilise gluOrtho2D(-(float)w/h, (float)w/h, -2.0, 2.0); pour définir l'ortho.

Cependant, lorsque je déplace ma souris pour voir les coordonnées du monde, le coin inférieur gauche est (-1, -1) et le coin supérieur droit est (1, 1). Y at-il quelque chose que je fais mal ici? Je suppose que puisque je mets bas et haut à -2 et 2 respectivement dans l'appel gluOrtho2D, il devrait me donner les bonnes coordonnées.

S'il vous plaît aidez-moi si vous voyez quelque chose qui pourrait être faux.

Voici mon code jusqu'à présent, veuillez ignorer les variables de bras et les fonctions de dessin.

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <iostream> 

#if 0 /*unix*/ 
#include <GL/glut.h> 
#endif 

#if 1 /*apple */ 
#include <GLUT/glut.h> 
#include <OPENGL/gl.h> 
#include <OPENGL/glext.h> 
#endif 

#if 0 /*windows*/ 
#include <io.h> 
#include <fcntl.h> 
#include <glut.h> 
#endif 

int GW, GH; 
bool animfore, animupper; 
float foreangle, upperangle; 

using namespace std; 

void drawShoulder(); 
void drawUpper(); 
void drawFore(); 

void display() { 
    glClear(GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 

    //draw shoulder 
    glPushMatrix(); 
     drawShoulder(); 
     //draw upper arm 
     glPushMatrix(); 
      drawUpper(); 
      //draw forearm 
      glPushMatrix(); 
       drawFore(); 
      glPopMatrix(); 
     glPopMatrix(); 
    glPopMatrix(); 

    glutPostRedisplay(); 
    glutSwapBuffers(); 
} 

void drawShoulder() { 
    //cout << "Enters" << endl; 

    glBegin(GL_POLYGON); 
     glColor3f((float)30/255, (float)0/255, (float)30/255); 
     glVertex2f(-2.0, -0.4); 
     glVertex2f(-2.0, -1.0); 
     glVertex2f(-1.0, -1.0); 
     glVertex2f(-1.0, -0.4); 
    glEnd(); 
} 

void drawUpper() { 

} 

void drawFore() { 

} 

void reshape(GLsizei w, GLsizei h) { 
    GW = w; 
    GW = h; 
    glViewport(0, 0, w, h); 
    glLoadIdentity(); 
    gluOrtho2D(-(float)w/h, (float)w/h, -1.0, 1.0); 
    cout << "Enters" << endl; 
} 

void keyboard(unsigned char key, int x, int y) { 
    switch(key) { 
     case 'q' : case 'Q' : 
      exit(EXIT_SUCCESS); 
      break; 
    } 
} 

//control arm animations 
void idle() { 
    if(animupper) { 

    } 
    if(animfore) { 

    } 
} 
float p2w_x(int gx) { 
    return (float)2.*GW/(GW*GH-GH)*gx-(float)GW/GH; 
} 

float p2w_y(int gy) { 
    int py = GH-1-gy; 
    return (float)2./(GH-1.)*py-1; 
} 

void mouseMove(int x, int y) { 
    cout << "(" << p2w_x(x) << "," << p2w_y(y) << ")" << endl; 
} 

int main(int argc, char **argv) { 
    // global variable intializations 
    GW = 600; 
    GH = 300; 
    animfore, animupper = true; 

    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE); 

    // initialization 
    glutInitWindowSize(600, 300); 
    glutInitWindowPosition(100, 100); 
    glutCreateWindow("Robot Arm"); 
    glClearColor(1.0, 1.0, 1.0, 1.0); 

    // callback functions 
    glutDisplayFunc(display); 
    glutKeyboardFunc(keyboard); 
    glutReshapeFunc(reshape); 
    glutIdleFunc(idle); 
    glutMotionFunc(mouseMove); 

    glutMainLoop(); 
} 

Répondre

0

utilisation glMatrixMode (GL_PROJECTION) avant de régler toute matrice de projection, puisque chaque opération de matrice est présent dans la pile de matrice en cours.

Ensuite, pour les opérations de dessin, utilisez glMatrixMode (GL_MODELVIEW).

+0

Cela ne m'aide toujours pas à créer un système de coordonnées où il est 4x2 et centré à (0,0). – sudo

+0

Mention d'avertissement. 'glMatrixMode()' est une fonctionnalité déprimée. https://www.khronos.org/opengl/wiki/Legacy_OpenGL Cela concerne le pipeline de fonction fixe, et il est maintenant recommandé dans 'OpenGL moderne' de calculer vous-même vos matrices et de les appliquer dans vos shaders. –

0

Votre problème est-il que les valeurs imprimées ne correspondent pas au système de coordonnées souhaité? La projection manrix (glOrtho et les amis) n'a d'effet que sur les coordonnées que vous spécifiez pour openGL - et vous n'avez rien à voir avec la façon dont votre boîte à outils de fenêtrage communique les positions de la souris à votre application.

C'est à vous de démultiplier les coordonnées de fenêtre fournies par GLUT dans le format/système de coordonnées que vous voulez. Il semble que vos fonctions p2w_y et p2w_x ne soient pas codées pour faire ce que vous voulez.

Questions connexes