场景视图变化类似照相机拍照:
1.把照相机固定到三脚架上,并让它对准场景(视图变换)
使用gluLookAt 设置视图变换
2.对场景进行安排,是各个物体在照片中的位置是我们所希望的(模型变换)
使用模型变换的目的是设置模型的位置和方向,如,缩放,旋转灯
3.选择照相机镜头,并调整放大的倍数(投影变换)
正投影与透视投影
4.确定最终照片的大小(视口变换)
glViewport
透视投影
透视投影最显著的特征就是透视缩短,即越近的物体越大,越远的物体越小
glFrustum(left,right,bottom,top,near,far)
对于此函数,可将近观察者平面中心近似原点。Left 为原点左半部分,用负数表示。right为原点右半部分,用正数表示 其他也是一样。
还有另外一个函数和上面功能基本一致,也是指定透视投影的
glPersPective(foxy,aspect,near,far)
foxy:角度(可计算)
aspect:宽高比
near:近景距离
far:远景距离
正投影
通俗的说物体和观察者的举例不影响物体看上去的大小,及物体以原大小进行投影,不会随着观察者距离变化而变大或缩小
glOrtho()函数创建一个正交平行的视景体
视景体由6个平面构成:上下左右远近,最基本的视景体剪裁可针对这6个平面进行剪裁
视景体剪裁
做法:
1.启用视景体剪裁
glEnable(GL_CLIP_PLANE0)
2.设置剪裁面
Gldouble eqn[4]={0,1,0,0};
3.剪裁
glClipPlane (GL_CLIP_PLANE0, eqn)
glMatrixMode | GL_MODELVIEW GL_PROJECTION GL_TEXTURE |
指定需要修改的矩阵 |
glLoadIdentity | 重置矩阵 | |
glTranslatef(x,y,z) | 移动矩阵 | |
glRotate | 旋转矩阵 | |
glScale | 缩放矩阵 | |
glPushMatrix | 压入矩阵堆栈 | |
glPopMatrix | 弹出矩阵 | |
glShadeModel | GL_SMOOTH //平滑 GL_FLAT //单调 |
着色模式 单调模式处理下整个图元的颜色就是它任意一个顶点的颜色,平滑模式下,每个顶点的颜色都是单独处理的 |
视景体剪裁代码:
#include "header.h" void init(void) { glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); } void display(void) { GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0}; GLdouble eqn2[4] = {1.0, 0.0, 0.0, 0.0}; glClear(GL_COLOR_BUFFER_BIT); glColor3f (1.0, 0.0, 1.0); glPushMatrix(); glTranslatef (0.0, 0.0, -5.0); glClipPlane (GL_CLIP_PLANE0, eqn); glEnable (GL_CLIP_PLANE0); //glClipPlane (GL_CLIP_PLANE1, eqn2); //glEnable (GL_CLIP_PLANE1); glRotatef (90.0, 1.0, 0.0, 0.0); glutWireSphere(1.0, 20, 16); glPopMatrix(); glFlush (); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode (GL_MODELVIEW); } void keyboard(unsigned char key, int x, int y) { switch (key) { case 27: exit(0); break; } } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }