如何简单地缩放 openGL 中的对象?

How to simply Scale an object in openGL?

我正在尝试学习如何在 openGL 中进行缩放、旋转和平移,但我不确定具体如何操作。我尝试按照示例进行操作,但它不起作用。下面是我的示例代码,它没有绘制对象。谁能告诉我我做错了什么?

#include <stdlib.h>
#include <GL/glut.h>

GLfloat vertices[][2] = { { -1.0,1.0 },{ -1.0,0.857 },
{ -0.857,0.857 },{ -0.857,1.0 } };

void drawObject() {

    glColor3f(0.0f, 0.0f, 0.0f);
    glBegin(GL_POLYGON);
    glVertex2fv(vertices[0]);
    glVertex2fv(vertices[1]);
    glVertex2fv(vertices[2]);
    glVertex2fv(vertices[3]);
    glEnd();
}

void display(void)
{

    glClearColor(1.0, 1.0, 1.0, 1.0);
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glShadeModel(GL_SMOOTH);
    glColor3f(0.0f, 0.0f, 0.0f);
    glPushMatrix();
    glLoadIdentity();
    glScalef(2.0, 2.0, 0.0);
    drawObject();
    glPopMatrix();

    glFlush();
}

int main(int argc, char** argv)
{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(1600, 800);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Window");
    glutDisplayFunc(display);
    glutMainLoop();
}

使用您当前的坐标和变换,您的对象就在屏幕之外。

将所有变换矩阵设置为identity时,直接在clip中绘制space。如果您从不使用 1 以外的输入 w 值(glVertex2* 将始终将 w 设置为 1),剪辑 space 等于规范化设备 space。在规范化设备 space 中,观察体积被定义为沿所有维度的立方体 [-1,1]。

但是,通过应用 glScale(2.0, 2.0, 0.0),您可以将对象缩放 2,中心为原点。因此,场景的可见部分是对象 space 坐标中 [-0.5,0.5] 范围内的所有内容,而您的对象完全超出该范围。

如果要缩放单个对象,应先将其平移到中心,然后再应用缩放。 以下一系列转换应该会使您的对象可见:

glScalef(2.0f, 2.0f, 1.0f);
glTranslatef(0.9285f, -0.9285f, 0.0f);

另请注意,所有这些在现代 GL 中都是弃用。您依赖于具有集成矩阵堆栈、即时模式 (Begin/End) 渲染、GL_POLYGON 原始类型的固定功能管道,这些都已从现代核心中 移除 OpenGL 的配置文件。如果您现在刚开始使用 GL,我强烈建议您学习新方法。