MinLu的个人博客分享 http://blog.sciencenet.cn/u/MinLu

博文

OpenGL(一) 关于OpenGL中的变换问题

已有 5896 次阅读 2011-11-17 17:33 |个人分类:每天进步一点点|系统分类:科研笔记| OpenGL学习

在使用OpenGL进行画图时,存在着视口变换、投影变换、视图模型变换这三种变换。通过定义这些变换,可以有效地按照图形的组织关系地绘制图形。
视口变换
视口变换,定义的是OpenGL呈现最终渲染结果的画布大小。
使用glViewport(int left_x, int left_y, int width, int height); (left_x, left_y)与(width, height)均是参照窗口系统定义的窗口大小,在OpenGL中即为glutInitWindowSize(int width, int height)。
值得注意的是,在一个OpenGL程序中,可以定义多个视口,在每个视口中分别定义相应的投影变换、视图模型变换和图形绘制,以此来实现多个视口绘制。
投影变换
投影变换,定义的是相对于观察点的视景体类型及大小,决定了OpenGL在世界坐标中所绘制的图形到视平面的投影及剪裁方式。
使用glMatrixMode(GL_PROJECTION)作为关键词将当前矩阵堆栈定义为投影矩阵堆栈。最好在开始使用矩阵堆栈时,用glLoadIdentity()将单位矩阵压栈,可以理解为是还原重置。
视景体分为两种,平截头体和长方体。这两种视景体分别对应着透视投影和正投影两种投影方式。
在透视投影中,使用glFrustum()或glPerspective()来定义平截头体,实现的是近大远小的投影效果,具有立体表现力。
在正投影中,使用glOrtho()或glOrtho2D()来定义长方体,物体距离视平面的远近并不影响最终在视平面上的大小,保持了物体的实际大小。
视图模型变换
视图模型变换,定义的是在世界坐标系中的变换,决定了物体最终渲染的位置,其实这是由视图及模型变换来完成的,但由于这两者是相对的关系,因此统称为视图模型变换。
与投影变换相同,视图模型变换也存在着它的矩阵堆栈,用关键词GL_MODELVIEW来进行选择。
视图变换定义了观察点的位置、聚焦点以及朝上发现,使用gluLookAt()来定义。在确定了观察点后,视景体的位置也就确定,由此也就确定了裁剪区。
模型变换定义了如何在世界坐标系中物体的变换,关于理解变换存在这两种方式----全局固定世界坐标系以及局部移动物体坐标系。局部移动坐标系的理解方法更为直观,多采用此种方法,即在每个物体上绑定一个局部移动坐标系,变换在程序中的调用顺序与应用顺序相同,均作用与这个绑定的局部坐标系,在绘制时,只需给出物体在这个局部坐标系中的坐标即可。这样做的好处是,可以避免计算复杂的变化后物体的全局坐标。在程序实现时,可以使用OpenGL所提供的三个直观的函数glRotatef,glReshape,glTranslatef来完成,也可以使用glMultiMatrix这样的矩阵乘法操作来完成。



https://blog.sciencenet.cn/blog-655085-509050.html


下一篇:OpenGL(二)关于OpenGL中的色彩问题
收藏 IP: 124.205.77.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-27 13:02

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部