Создание 2D системы координат 4x2 с центром вокруг (0,0)? - PullRequest
0 голосов
/ 06 ноября 2010

У меня проблемы с установкой матрицы ортогональной проекции с размерами 4x2, где (0,0) в центре, (-2, -1) в левом нижнем углу и (2, 1) в верхнемправый угол.

Я использую glutInitWindowSize(600, 300); для инициализации размера окна.В моей функции изменения формы я использую glViewport(0, 0, w, h);, чтобы установить область просмотра.Также в моей функции изменения формы я использую gluOrtho2D(-(float)w/h, (float)w/h, -2.0, 2.0);, чтобы установить орто.

Однако, когда я перемещаю мышь, чтобы увидеть координаты мира, нижний левый угол (-1, -1) иверхний правый угол (1, 1).Здесь я что-то не так делаю?Я предполагаю, что поскольку я устанавливаю bottom и top в -2 и 2 соответственно в вызове gluOrtho2D, он должен дать мне правильные координаты.

Пожалуйста, помогите мне, если вы увидите что-то, что может быть неправильным.*

Вот мой код, пожалуйста, игнорируйте переменные arm и функции рисования.

#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();
}

1 Ответ

1 голос
/ 06 ноября 2010

Попробуйте установить glMatrixMode( GL_PROJECTION ) перед выполнением орто-вызова, а затем установите его обратно в GL_MODELVIEW при выполнении ваших преобразований.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...