本文源自:http://dev.gameres.com/Program/Visual/3D/OpenGLTutorial/OpenGL_5.htm ?
如果用过3DS/LIGHTWAVE等任何一种三维图形软件包,就可以发现制作一个三维场景无非以下几项工作:
建模:制作各种物体。
放置:将做好的各物体通过平移、旋转等放到场景空间的适当位置。
上色:给物体模型指定颜色或表面纹理。
打灯:在场景中适当位置放置几盏灯以照亮场景。
摄像:在空间适当位置放上适当角度的摄像机,以得到所需的视觉效果。
用OpenGL开发应用程序与之类似,通常是:
设定视见体
定义光源
生成场景
而三维图形生成的流程如下:
放置几何变换:平移、旋转、缩放等
视见变换:裁剪、消隐、投影等
视见体设定:
视见体有两种:正投影体和透视投影体,正投影视见体中的物体在屏幕上的投影不会出现近大远小的现象,而透视投影视体则与人眼的观察结果类似,离观察点越远的物体在屏幕上的投影越小,因此透视投影体中的观察结果看起来更真实一些。
定义透视投影体的方法是:
glFrustum(left,right,bottom,top,near,far);
//物体在这六个参数界定的范围内可见,超出边界将被裁掉。
//left,bottom,代表左下 right,top代表右上
定义透视投影体的方法是:
glOrtho(left,right,bottom,top,near,far);
//物体在这六个参数界定的范围内可见,超出边界将被裁掉。
综上所述,一个三维图形应用程序在建好OpenGL Pipleline之后就要向管道发如下一系列的命令,以建立一个三维观察环境:
//1、设定视见体,在窗体的Resize事件时
void __fastcall TForm1::FormResize(TObject *Sender)
{
??? glViewport(0, 0, Width, Height);
??? //使用Form窗体的指定区域为显示区
??? //如改为Width/4,Height/4,Width/2,Width/2,
??? //则只用Form1的-窗体的中间1/4进行显示
??? glMatrixMode(GL_PROJECTION); //切换到投影矩阵栈
??? glLoadIdentity(); //清除投影矩阵
??? glFrustum(1.0,-1.0,-1.0,1.0,1.0,-1.0);
??? //指定透视视见体范围
??? //超出部分将被裁去
??? //或正投影glOrtho(1.0,-1.0,-1.0,1.0,1.0,-1.0);
??? glMatrixMode(GL_MODELVIEW); //切换到模型视见矩阵栈
??? glLoadIdentity(); //清除视见矩阵
}
说明:视见环境的设定还有许多其它的细节,以后会逐步介绍。