1.从绘制立方体来理解顶点数组以及视图变换
看了Opengl编程指南第二章的内容,其中一个很重要的概念就是顶点数组,也按照书上所说写了一个绘制立方体的程序,其实是一个很简单的程序,可是一开始总是只显示一个正方形。这样的问题第一反应肯定是视角的问题,于是就想到视角变换glRotatef。
其实刚开始一直在尝试投影变换的设置,由于不理解投影变换和视角变换的区别。后面仔细去看Nate Robbin的投影教程,才明白投影解释的是如何把模型投影到平面上,glOrtho、glFrustum、gluPerspective这三个函数都是对投影参数的设置,其实质如何从三维到二维的过程,而不是模型自身如何变换。
而视角变换才是解决模型从哪个角度去显示,其实质是模型自身如何放置问题
void display3()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glRotatef(55, 1.0, 1.0, 0.0);//
static const GLfloat vertex_list[][3] =
{
-0.5f, -0.5f, -0.5f,
0.5f, -0.5f, -0.5f,
-0.5f, 0.5f, -0.5f,
0.5f, 0.5f, -0.5f,
-0.5f, -0.5f, 0.5f,
0.5f, -0.5f, 0.5f,
-0.5f, 0.5f, 0.5f,
0.5f, 0.5f, 0.5f,
};
/*glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertex_list);*/
static const GLint index_list[][4] = {
0, 2, 3, 1,
0, 4, 6, 2,
0, 1, 5, 4,
4, 5, 7, 6,
1, 3, 7, 5,
2, 6, 7, 3,
};
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, vertex_list);
glDrawElements(GL_QUADS, 24, GL_UNSIGNED_INT, index_list);
glFlush();
}
2.如何理解模型视图变换
书上说可以从两个方面去理解,一个是全局坐标系,一个是局部坐标系。前面一个可以理解为模型放置好之后去执行变换,所以在实际操作过程中是和代码相反的顺序;后面一个是以模型中心建立局部坐标系,然后去移动坐标系在进行绘制,所以这个顺序恰好相同。
就那书上的例子绘制太阳和月亮来说,
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 1.0, 1.0);
glPushMatrix();
glutWireSphere(1.0, 20, 16);
glRotatef((GLfloat)year, 0.0, 1.0, 0.0);
glTranslatef(2.0, 0.0, 0.0);
glRotatef((GLfloat)day, 0.0, 1.0, 0.0);
glutWireSphere(0.2, 10, 8);
glPopMatrix();
glutSwapBuffers();
}