Opengl二维图形与屏幕不平行

Opengl二维图形与屏幕不平行,opengl,2d,transformation,homography,Opengl,2d,Transformation,Homography,我认为我画的二维平面与屏幕不平行 首先,在我的调整窗口大小功能中,我将: static void Resize(int w, int h) { width = w; height = h; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); float32 ratio = width / height; b2Vec2 extents(ratio * 25.0f, 25.0f); ex

我认为我画的二维平面与屏幕不平行

首先,在我的调整窗口大小功能中,我将:

static void Resize(int w, int h)
{
width = w;
height = h;

glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
float32 ratio = width / height;

b2Vec2 extents(ratio * 25.0f, 25.0f);
extents *= viewZoom;

b2Vec2 lower = settings.viewCenter - extents;
b2Vec2 upper = settings.viewCenter + extents;
gluOrtho2D(lower.x, upper.x, lower.y, upper.y);
}
下面是我初始化opengl的方法

glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA );
glutInitWindowSize(width, height);
mainWindow = glutCreateWindow("window");
以及drawscene功能:

void drawScene() {

    glClear(GL_COLOR_BUFFER_BIT );

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();



    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glColor3f(1.0f, 1.0f, 1.0f);

    glBegin(GL_QUADS);
    glTexCoord2f(0.0f, 0.0f);
    glVertex2f(cords[0].x,cords[0].y);
    glTexCoord2f(1.0f, 0.0f);
    glVertex2f(cords[1].x,cords[1].y);
    glTexCoord2f(1.0f, 1.0f);
    glVertex2f(cords[2].x,cords[2].y);
    glTexCoord2f(0.0f, 1.0f);
    glVertex2f(cords[3].x,cords[3].y);
    glEnd();

    glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);

    glutSwapBuffers();
}
我认为代码没有问题,因为我已经为ModelView和Projection加载了Identity。我画的结果是,如果我的矩形平行于水平线,那么它就是一个矩形,当旋转一定角度时,它就会倾斜。看起来我画的飞机是向后倾斜的。

事情很简单:

float32 ratio = width / height;
因为宽度和高度都是int,所以比率不准确


如果转换为float,则变为正常。

Pro提示:始终在显示功能中设置视口和投影矩阵。这样可以避免程序的其他部分使其处于不希望的状态。我认为您可能需要添加
gluLookAt
来指定眼睛位置。因为默认情况下,眼睛位置为1,1,1。因此,如果矩形足够大,那么它可能会在变换后位于眼睛位置的后面。或者用glOrtho(lower.x,upper.x,lower.y,upper.y,-20,20)替换
gluOrtho2D
。。Pro提示2:OpenGL 1.0基于在固定管道中完成任务的旧方法。如果你刚开始的话,我建议你把额外的精力放在弄明白OpenGL2上。。。学到的技能不会被弃用。