主要衔接上述的文章继续说明,其中主要的函数作用和使用方法
#include "3dr/freeglut1/include/GL/freeglut.h"
#include <QApplication>
void init(void)
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_FLAT);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,1.0,1.0);
glLoadIdentity();
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0);
glScalef(1.0,2.0,1.0);
glutWireCube(1.0);
glFlush();
}
void reshape(int w ,int h)
{
glViewport(0,0,(GLsizei)w,(GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);
glMatrixMode(GL_MODELVIEW);
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(100,100);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
return a.exec();
}
1、视图变换
视图变换相当于相机三脚架放置位置,需要从哪个角度去看物体。‘
glLoadIdentity():当前矩阵设为单位矩阵
gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0):
第一组eyex, eyey,eyez 相机在世界坐标的位置
第二组centerx,centery,centerz 相机镜头对准的物体在世界坐标的位置
第三组upx,upy,upz 相机向上的方向在世界坐标中的方向
可以形象的描述为人眼:
第一组数据就是脑袋的位置
第二组数据就是眼睛看的物体的位置
第三组就是头顶朝向的方向(因为你可以歪着头看同一个物体)。
如果不使用该函数的话,那么视角有默认的方向。
2、模型变换
使用模型变化的目的主要是设置模型的方向和位置,可以进行缩放、旋转、移动。
glScalef(1.0,2.0,1.0):参数指定在各个坐标轴的缩放比例,1.0表示不缩放。
glTanslatef(0.0,0.0,-5.0):模型变换函数
(上述的gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0)可以用函数glTanslatef(0.0,0.0,-5.0)来达到同样的效果)。
glutWireCube(1.0):绘制立方体函数。
3、投影变换
投影变换相当于相机的镜头,可以选择广角、长焦还是标准镜头,进而决定哪些物体可以展现出来以及如何展示。
主要提供两种类型的投影展示:透视投影(perspective projection)和正投影(orthographic projection)。在进行投影变换之前需要做一些准备。
glMatrixMode(GL_PROJECTION):当前举证用于投影矩阵
glLoadIdentity();
glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0):投影变换
(上述的也可以用gluRerspective()函数替代)
glMatrixMode(GL_MODELVIEW):当前举证用于视图矩阵,而投影矩阵不受影响
4、视口变换
**视口变化和投影变换共同影响场景映射到屏幕的效果。**视口主要是屏幕展示区域的大小。
glViewport(0,0,(GLsizei)w,(GLsizei)h):参数描述额窗口内有效空间的原点,以及有效屏幕的宽度和高度。
5、绘制场景
在指定上述的必要变换之后,就可以绘制场景了,经过转换之后的坐标到投影坐标,如果坐标在投影坐标之外就被裁减,然后最终显示在视口区域。
其他函数具体参考书籍《OpenGL编程指南原书第九版本》