[OpenGL]OpenGL几何变换的秘密(模型变换、视点变换、全局变换、局部变换)

1.模型变换(Model transformation)---- 视点不变,变物体

我们在OpenGL中通过定义一组顶点来定义一个模型,我们遇到的平移、缩放、旋转等变换都可以理解为模型变换,视点不变,主要对物体进行操作。

在OpenGL中,我们使用glMatrixMode(GL_MODELVIEW)来处理模型变换,我们知道OpenGL使用堆栈管理矩阵,所以我们有不同的堆栈进行管理,有模型变换矩阵堆栈,视点变换矩阵堆栈,还有纹理变换矩阵堆栈等等,这句话就是告诉OpenGL,我们要处理模型变换。

2.视点变换(View transformation)---- 物体不变,变视点

OpenGL成像主要是采用虚拟相机模型,在场景中我们通过模型变换,将物体放在场景中不同的位置,最终哪些部分需要显示在屏幕上,主要是由视点变换、投影变换等决定。视点变换阶段,我们通过假想的相机来处理矩阵计算。,所谓的视点空间,视点坐标系都是为了方便处理,引入的坐标空间。
在OpenGL中,我们主要使用

gluLookAt(eyex,eyey,eyez,centerx,centery,centerz,upx,upy,upz)

来达到模拟物体不动,变换视点的效果

总结
其实两者本质上是一样的,gluLookAt()还是只是计算出了一个变换矩阵


3.全局变换和局部变换

大致先解释一下:
①全局变换主要是在全局坐标系,也叫世界坐标系中进行变换,基本是定死的,如下图的第一行变换就是全局变换,正方形在xyz坐标系中,先想(10,0,0)方向平移10,再绕z轴旋转45°
②局部变换主要是在局部坐标系,也叫模型坐标系,就是字面意思模型自己的坐标,如下图第二行,第三行变换,当我们以局部坐标系对正方形进行先平移,后旋转的操作时,会发现和全局变换的结果有区别,但是当我们反过来,先旋转,再平移变换,所达到的结果和全局变换的效果一致
[OpenGL]OpenGL几何变换的秘密(模型变换、视点变换、全局变换、局部变换)_第1张图片
总结:
(1)如果只有一次变换(旋转、平移。缩放),那么全局变换和局部变换效果一样
(2)如果是多个变化的组合,全局变换和局部变换效果不同
(3)局部变换的结果正好相当于组合顺序相反的全局变换


看到这,相信很多人都会觉得那为什么要有局部变换呢?全部都用全局变换就好了,为什么这么麻烦呢?
个人理解:全局变换适用于整个模型的变换,当我们涉及到模型的部分组件变换的时候,以模型坐标系作为变换的计算更为便捷。例如:当我们场景中有一个机器人时,机器人整体的行走,跑动等位移,我们可以用全局变换,去看机器人跑动了多远,但是当机器人跑动的时候,手臂,脚的摆动角度,高度这些,我们如果用全局变换去计算会变得非常麻烦,但是当我们以模型坐标系去定位,机器人手脚的位置,这样的计算就相对来说会变的简单不少

你可能感兴趣的:([OpenGL])