- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OpenGL矩阵操作
OpenGL的矩阵变换操作方法
借助OpenGL的矩阵堆栈,保存各个物体的矩阵变换
火柴棍案例
glMatrixMode(GL_PROJECTION);
glMatrixMode(GL_MODELVIEW); 将当前变换矩阵设置为模型视图变换矩阵。
glPushMatrix,glPopMatrix—压入和弹出当前矩阵堆栈
glGet(GL_MAX_MODELVIEW_STACK_DEPTH);
glGet(GL_MAX_PROJECTION_STACK_DEPTH);
来获取模型视图矩阵堆栈和投影矩阵堆栈的最大堆栈深度。一般情况下(在Windows平台上),模型视图的最大堆栈深度是32,而投影堆栈的最大深度是2。
自己保存各个物体的空间变换矩阵
float M[4][4]; //其中M[j,i]表示矩阵M的第j行,第i列的数据。
float M[16]; //也可以创建一个一维数组
无论是2维数组还是一维数组,都是按照列优先的顺序保存的。
如图所示
1. 读取矩阵堆栈
glGetFloatv(GL_MODELVIEW_MATRIX, M);
glGetFloatv(GL_PROJECTION_MATRIX, M);
2. 设置矩阵堆栈,用于描画
glLoadIdentity(); //加载4*4单位矩阵;
glLoadMatrix{fd}(*m); //加载指定4*4矩阵m;
glMultiMatrix{fd}(*m); //当前矩阵右乘*m;
图形变换
1. 几何变换:平移、缩放、旋转
2. 齐次坐标:用n+1维向量表示n维向量,比如,(wx,wy,wz,w)表示(x,y,z)。
通常,令w=1,用来进行复合几何变换。
3. 坐标变换:根据图形在一个坐标系下的坐标求其在另一坐标系下的坐标。
4. 3D空间通过投影,可以在2D屏幕上显示。同时,在投影面上定义一个窗口。
只有窗口内的图形才显示。在屏幕上定义一个矩形视区,然后,从窗口到视区进行一一映射。
5. 透视投影:空间任意一点的透视投影是投影中心与空间点构成的投影线和投影平面的交点。
平行投影:投影方向于投影面垂直,为正投影,否则为斜投影。
6. 视变换:从世界坐标系变换到视坐标系。
由于视平面总是和XvYv面平行,所以,3D物体在视平面的投影和在输出设备上的显示是一致的。
三维物体的显示需要以下变换:
几何变换 - 视变换 - 投影变换 - 窗口到视区的变换
7. 视景体:通过视平面上的窗口观察到的区域,经过平行于视平面的前后裁剪面的裁剪而得到的区域。
由于消隐很耗时,且消隐需要图形的深度信息,因此在投影之前进行裁剪比较合理。
8. 视景体的规范化:
A.平行投影规范化视景体,-1=x=1;-1=y=1;0=z=1;
B.把透视视景体映射到沿与窗口垂直的矩形平行通道里;
C.平移窗口中心到原点;
D.缩放视景体的尺寸,使其满足A中的规范化。
9. 视区变换:通常设置视区为窗口大小的矩形区域。
一般来说,视区变换之前已经完成了所有的几何变换和投影变换,且已经进行了裁剪。
OGL实现
1. ModelView矩阵保存着视点变换和模型变换矩阵的累积乘积;
glGetIntegerv(GL_MAX_MODELVIEW_STACK_DEPTH)可以得到矩阵堆栈中系统允许的最大矩阵数目;
Projection矩阵包含了一个描述视景体的投影变换矩阵。投影矩阵很少复合,Projection矩阵堆栈只需要两层;
glGetIntegerv(GL_MAX_PROJECTION_STACK_DEPTH)可以得到系统支持的投影矩阵堆栈的深度。
2. glMatrixMode(GLenum mode);//设置当前矩阵的操作类型;
GL_MODELVIEW(模型视图)/GL_PROJECTION(投影)/GL_TEXTURE(贴图);
3. glLoadIdentity();//加载4*4单位矩阵;
glLoadMatrix{fd}(*m);//加载指定4*4矩阵m;
glMultiMatrix{fd}(*m);//当前矩阵右乘*m;
4. glTranslate{[fd](x,y,z);//平移;
glRotate{fd}(angle,x,y,z);//旋转;
glScale{fd}(x,y,z);//缩放;
5. glPushMatrix();//把当前矩阵压入矩阵堆栈;
glPopMatrix();//从堆栈弹出矩阵(矩阵堆栈的顶为当前阵);
6. gluLookAt(GLdouble eyex,GLd
文档评论(0)