我正在尝试学习如何在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();
}
答案 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,我强烈建议您学习新方法。