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

时间:2016-02-14 20:31:40

标签: opengl glut

我正在尝试学习如何在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();
}

1 个答案:

答案 0 :(得分:0)

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

将所有转换矩阵设置为标识时,您将直接在剪辑空间中绘图。如果您从未使用除1之外的输入w值(glVertex2*将始终将w设置为1),则剪辑空间等于规范化设备空间。在标准化设备空间中,查看体积被定义为沿所有维度的立方体[-1,1]。

但是,通过应用glScale(2.0, 2.0, 0.0),您可以将对象缩放2,其中心位于原点。因此,场景的可见部分是对象空间坐标中[-0.5,0.5]范围内的所有内容,并且您的对象完全在该范围之外。

如果要缩放单个对象,则应首先将其转换为中心,然后应用缩放。 以下转换序列应使您的对象可见:

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

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

相关问题