OpenGL学习九:视图简介

 场景视图变化类似照相机拍照:
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)

OpenGL学习九:视图简介

 

 

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;
}

 

你可能感兴趣的:(OpenGL)