调试一个绘制茶壶程序,可是结果什么显示也没有。究竟忽略了哪些还不清楚的问题呢?在此,我来做一个学习笔记。
检查代码
首先在一系列检查下,发现问题可能就出在display()
函数和myReshape()
函数下。先来看下原程序代码。
1 | void display(void) |
1 | //窗口大小变化时的回调函数 |
由于之前的学习,我知道一定要把摄像机往屏幕外移动,这样才能看到坐标中心,否则绘制出来时显示的是在茶壶内部。
因此要在display()添加代码,-G_fDistance
是定义的一段距离。
1 | //坐标中心向Z轴平移-G_fDistance (使坐标中心位于摄像机前方) |
此外,作为一个初学者,我先是不太清楚glColor3f
和glColor4f
的区别。其次,对于myReshape()
函数中的透视方式不太清楚。所以来看看是不是这其中有什么问题。
glColor
发送颜色数据
转到定义
1 | glColor3f (GLfloat red, GLfloat green, GLfloat blue); |
1 | glColor4f (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha); |
参数
red , green , blue 指定当前新的红、绿、蓝的颜色值
alpha 透明度,指明当前新的 alpha 颜色值 ,只有在 glColor4
函数中带4个变量时才会指定此参数。
投影变换函数
投影变换:给定视点和视线方向,计算当前顶点的投影点坐标。
调用投影变换函数的步骤
先要理解OpenGL中的变换都是对矩阵的操作。即是当前的矩阵乘上操作对应的一个矩阵。
乘以变换矩阵,设置模型的位置。
乘以投影矩阵,设置模型的投影方式。
乘以纹理矩阵,设置模型的纹理方式。
而用来指定乘以什么类型的矩阵, 就是glMatriMode
,有3种模式:
GL_PROJECTION 投影
GL_MODELVIEW 模型视图
GL_TEXTURE 纹理
所以调用投影矩阵的一系列操作即为
1 | glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影矩阵 |
三个常用投影函数
投影变换函数
- glFrustum(),
1 | void glFrustum(GLdouble left, GLdouble Right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far); |
- gluPerspective()
1 | void gluPerspective(GLdouble fovy,GLdouble aspect,GLdouble zNear, GLdouble zFar); |
- glOrtho()
1 | glOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble near, GLdouble far) |
显示不出的原因
在使坐标中心位于摄像机前方之后发现还是显示不出来,我想肯定是投影出了问题,研究了glFrustum
这个函数。
原代码:
1 | glFrustum(-1.0, 1.0, -1.0, 1.0, 10.0, 30.0); |
其left、right、bottom、top参数正常,会不会是near和far的参数出了问题?
我的理解是由于near和far值表示为离视点的远近,当near值太大时便显示不出。
这里我去调试,修改了near的值为2之后发现可成功运行,大小相对显示的窗口也合适。
最终代码
1 |
|