标签(空格分隔): gamepython
本文主要介绍坐标系的观念, 以及在openGL中的视图及其相关的变换。api
在一个三维坐标系中, 一个模型的展现并不仅有一个视图就能够了。而是存在视图变换,投影变换,模型变换的过程。函数
顶点坐标---》(模型视图矩阵)----》视觉坐标---》(投影矩阵)----》裁剪坐标----》(透视坐标)----》规范化设备坐标----》视口变换----》窗口坐标
在opengl中主要经过如下三种变换达到最终控制屏幕输出:oop
为了进行视图,模型,投影变换, 能够建立一个4*4的矩阵M而后让他与顶点对应的坐标v相乘,以实现变换:
$$v' = Mv$$code
gl库只是一个图形库, 在咱们写的窗口程序的过程当中,我必须写窗口程序已经消息处理,咱们能够本身写 ,固然也能够用gult库。glut库中的api都已glut开头,最典型的现实一个窗口以下:orm
glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv[0]); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop();
代码很简单,而咱们要关注的是三个函数:ip
咱们能够用以下代码建立一个球体it
void PlanteDisplay::excute() { glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); drawSun(); } void PlanteDisplay::drawSun() { glutWireSphere(1.0, 20, 16); /* draw sun */ glutSwapBuffers(); }
咱们能够加上一些初始化的动做io
void init() { glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT); }
咱们会发现有以下所示的球体:class
咱们创见好了物体, 可是尚未设置好摄像机,opengl默认状况下回把摄像机正对着屏幕,而摄像机的镜头设置就在reshage中实现,在该函数中, 咱们主要控制视图变换和投影变换。
视口变换决定了场景所映射的有效屏幕区域的形状。利用函数glViewport来实现。
最简单的变换以下:
void cubeReshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); }
咱们改变屏幕的裁剪区域(投影变换):
glViewport(50, 0, (GLsizei)w/2, (GLsizei)h/2)
会发现以下图显示:
调用变换函数以前,须要肯定本身想修改的模型视图矩阵仍是投影视图矩阵,能够用glMatrixMode() 选择矩阵,并用glLoadIdentity() 把当前可修改矩阵清除为单位矩阵。
glMatrixMode(GL_PROJECTION); glLoadIdentity();
在OpenGl中,有三个函数用于执行模型变换:
如:
glTranslatef(0.2, .2, 0); glScalef(1.5, 2.0, 1); glutWireSphere(0.4, 50, 8);
视图 变换拥有膝盖观察点的位置和方向。能够由两种方法来实现:
正常如图所示:
gluLookAt(0.0, 0.0, 0.0 , 0.0, 0.0, -1.0 , -1.0, -1.0, 0.0);
gluLookAt(0.0, 0.0, 0.0 , 0.0, 0.0, -1.0 , 0.0, -1.0, 0.0);
投影变换最终控制线上屏幕的裁剪区域, opengl中能够用:
来进行投影变换。
glFrustum(GLdouble left , GLdouble right , GLdouble bottom , GLdouble top , GLdouble near , GLdouble far)
其中: (left, botton, -near)表示近侧裁剪平面左上角的坐标,(right, top, -near)表示右下角坐标,near和far分别表示观察点到近侧和远侧的距离。