OpenGL学习笔记——视图
来源:互联网 发布:公司企业 顶级域名 编辑:程序博客网 时间:2024/05/14 17:05
顶点变换的步骤:
视图与模型变换一起组成了模型视图矩阵,这个矩阵作用于物体坐标,产生视觉坐标。紧接着,如果指定了其他的裁剪平面,用于从场景中删除某些物体或者提供物体的裁剪视图,这些裁剪平面会在这个时候生效。之后,OpenGL使用投影矩阵产生了裁剪坐标。这个变换定义了一个视景体,位于这个空间外的物体将会被裁剪掉。随后发生的是透视除法,它把坐标除以w,产生规范化的设备坐标。最后,经过变换的坐标经过视口变换成为窗口坐标。可以通过控制视口的大小对最终的图像进行放大、缩小和拉伸(cocos2dx的屏幕适配原理)。
绘制立方体的例子:
void display(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0, 1.0, 1.0); glLoadIdentity(); gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); glScalef(1.0, 2.0, 1.0); glutWireCube(1.0); glFlush();}void reshape(int w, int h){ glViewport(0, 0, w, h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0, 1.0, -1.0, 1.0, 1.5, 20.0); glMatrixMode(GL_MODELVIEW);}void init(void){ glClearColor(0.0, 0.0, 0.0, 0.0); glShadeModel(GL_FLAT);}int main(int argc, char * argv[]){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100); glutInitWindowSize(500, 500); glutCreateWindow(argv[0]); init(); glutDisplayFunc(&display); glutReshapeFunc(reshape); glutMainLoop(); return 0;}
glLoadIdentity():把当前矩阵设置为单位矩阵,通过加载单位矩阵来清除当前矩阵。
diaplay()函数包括了模型和视图变换,以及绘制的函数,需要重复调用,用于绘制窗口的内容。
reshape()函数在窗口变化时指定投影变换。
- 视图变换:
视图变换相当于调整摄像机的位置和朝向。glLookAt指定了视图变换,如例子所示摄像机在(0, 0, 5)位置,镜头朝向(0, 0, 0),朝上向量指定为(0, 1, 0)。总体的效果就是把镜头向z轴的方向拉远了5个单位,便于看到绘制的立方体。 - 模型变换:
模型变换是为了调整物体的位置和方向,通常模型和视图变换组合成模型视图矩阵。display函数中就包含了模型和视图变换,因为需要重复调用满足绘制的需求,在窗口移动或遮挡时需要调用,所以需要加载单位矩阵。 - 投影变换:
投影变换相当于给摄像机选择镜头。在窗口创建,移动或改变形状时会调用reshape函数。 - 视口变换:
视口变换相当于最终经过处理的照片的大小和位置,例如照片是否需要放大和缩小,投影变换和视口变换决定了场景如何映射到屏幕上。
视图和模型变换
- 全局固定坐标系:如果采用全局固定的坐标系来作为参考,在这种坐标系中,矩阵乘法就会模型的位置、方向和缩放,就必须要注意乘法出现的顺序和在代码中出现的顺序相反。
- 局部移动坐标系:乘法出现的顺序和在代码中出现的顺序相同。
模型视图矩阵堆栈可以包含至少32个4x4的矩阵,而且一开始的顶部矩阵是单位矩阵。
投影变换
* 透视投影:平截头体;
* 正投影:正交平行视景体。
一般情况下投影矩阵堆栈的深度只有2层。常见的应用在显示包含帮助的文本窗口的时候,在正投影的模式下比较容易定位,可以暂时把投影模式设为正投影,然后再返回原来的透视投影模式。
视口变换
1、定义视口;
2、变换深度坐标。
0 0
- OpenGL学习笔记——视图
- openGL学习笔记2——视图和模型变换
- openGL学习笔记之一--视图
- OpenGL学习总结——视图
- OpenGL学习笔记(二):视图
- 图形学学习笔记]OpenGL视图矩阵变换
- openGL——视图
- openGL——视图
- MySQL学习笔记—视图
- OpenGL笔记--视图
- OpenGL——视图关系
- openGL学习笔记1——openGL程序框架
- OpenGL学习笔记 (3) —— 着色
- OpenGL学习笔记 (4) —— 旋转
- OpenGL学习笔记——颜色
- OPENGL学习笔记——光照
- OpenGL学习笔记——纹理贴图
- OpenGL学习笔记——雾
- HDU 2602 Bone Collector(01背包问题)
- codeforces 446E E. Divisors(数论+暴力)
- [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use)错误原因
- 【My97DatePicker】My97DatePicker 日期控件的使用与说明
- 架构师之路(3)---架构师的职责
- OpenGL学习笔记——视图
- 我也发软件开发团队的思考(侧重点是人员)
- 使用Dom4j解析XML
- AngularJS实现Tab
- 压缩感知入门(1)
- [leetcode 268]Missing Number
- 报表导出到word或者excel的功能实现
- Linux线程-互斥锁pthread_mutex_t http://blog.csdn.net/zmxiangde_88/article/details/7998458
- 架构师之路(4)---详解面向对象