当前课程知识点:移动图形概论 > 第三章 OpenGL ES 变换 > 3.2 旋转与位移变换 > 旋转与位移变换
同学们 大家好
今天我要给大家介绍的是
3D图形应用中最常见的两种变换形式
旋转和位移
今天要讲的主要内容包括
向量在这两种基本变换上的数学表达方法
还有一些常用的数学公式
首先我们来看一下
为什么要进行变换
为什么不在模型设计的时候
就把它的变换完成呢
因为模型在设计的时候都有它自己的中心
每个顶点都是相对于这个中心来定位
设计者也不知道将来模型在应用的时候
会放在具体的什么位置
在实际的场景中往往要将多个模型进行组合
对每个模型还有可能会进行不同的缩放
旋转或者平移
如果有比较简单的数学方法
来对这些变换来进行计算
那可真是太方便了
缩放可以说是最简单的一种图形变换
也就是改变模型的大小
对于一个矢量来讲
我们把它坐标排列成一个列矢量矩阵
那么等比例缩放就相当于是数乘运算
即在每个坐标分量上都乘以相同的缩放因子
而对于非等比例缩放那么就要使用到矩阵了
我们可以使用一个对角矩阵
每个对角元素就是相对应的坐标的缩放因子
就像这里展示的这个例子
xy和z坐标分别被缩放了sx
sy和sz倍
旋转的运算要略微复杂一些
就像右边的图所示
坐标为xy的a矢量旋转了theta角度之后变为a’
而矢量的坐标变成x’y’
利用一点三角函数的和角公式的知识
可以很容易地计算出新的坐标
x’y’可以由这里所展示的矩阵运算来获得
这个矩阵就叫做旋转变换矩阵
而对于三维的情况如果旋转的矢量
在旋转前和旋转后都在同一个坐标平面
那么三维情况的旋转变换矩阵
就和二维的表达形式非常接近
幻灯片中展示的就是围绕z轴旋转的旋转变换矩阵
它的前两行和前两列的内容
与前面二维的情况是一致的
在第三个维度上对角元素为1
其它的量为0
实际上在三维空间中任意多个旋转的组合
都可以表示成绕一个固定向量的一次旋转
而这个旋转过程也可以用一个
3×3的矩阵来表达出来
只是这个表达式一般比较复杂
这里就不进行推导了
平移运算看起来好像比旋转运行要简单
但在实际操作的时候就会发现有些问题
试想一下
对于三维的平移运算可以用3×3的矩阵来表示吗
比如说在x方向上移动a的距离
有没有可能用一个3×3的矩阵
使这个矩阵的表达式成立呢
答案是不行的
这时候就要引入一个所谓的齐次坐标的概念
增加1个维度叫做W维
成为4维向量
变换矩阵也将成为4×4的矩阵
三维坐标变为四维坐标之后
增加的第4维元素一般设置为1
就变成了相对应的齐次坐标
而齐次坐标可以除以第4维的分量
使得第4维成为1
并将第4维去掉
转化为笛卡尔坐标
当矢量通过齐次坐标来表示以后
在x方向平移a距离的平移变换
就可以用这个矩阵表达式来计算了
我们可以看到
原来的坐标xyz还有第4维的1
经过变换之后变成了x加a,y,z和第4维的1
这个变换矩阵的第四行
只有最后一个元素为1
保证了W分量不变
而矩阵的第四列
除了最后一个元素
其它三个元素就分别代表了
不同坐标轴方向上的平移距离
齐次坐标系的概念对于前面提到的
缩放和旋转变换也同样适用
新的变换矩阵只要加上第四行和第四列
其中增加的行或者列矢量只有第四个元素为1
其它的元素都是0
使用齐次坐标系统后
前面提到的各种变换的表达式获得了统一
不必专门为平移变换设置新的表达方式
在矢量处理的过程中
除了在最后显示这个矢量之前
没有必要把齐次坐标转为笛卡尔坐标
通过矩阵的乘法
所有不同的变换
可以组合成单一的4×4矩阵来表示
这种处理方式在图像处理软件和硬件中
都获得了非常广泛的应用
现在我们通过旋转和平移变换为例
展示一下齐次矩阵的组合
屏幕上面展示的m矩阵
由平移矩阵和旋转矩阵相乘所得
由于两个矩阵中都有很多的0和1
计算起来非常的简单
通过矩阵的乘法定义
很容易的就可以算出等号右边的结果
这个矩阵
左上角的3×3矩阵正好是旋转变换矩阵
而第四列也正好与平移矩阵相同
在这里我们是先进行了旋转变换
用R乘以P
然后进行平移转换
用T乘以前面的结果
这个平移变换和旋转变换
可以组合成M矩阵表示的变换
也就是M=T*R
实际上这个顺序非常重要
矩阵的乘法不支持交换律
先旋转再平移和先平移再旋转
也会得到不同的结果
因为先平移再旋转
旋转的时候会把平移的分量部分也进行了旋转
这往往并不是我们想要的结果
最后说下法线变换
法线指的是和模型表面垂直的一条向量
模型上每个顶点都可以有一个法线与之对应
在图形应用中
特别是在计算光照效果的时候
经常会用到法线的概念
在模型的设计过程中
模型表面的法线方向也是这个模型的重要数据
但模型在经历了变换之后
它的法线方向是否也要经历同样的变化呢
答案是否定的
一般情况下
法线的变换矩阵Q和模型的变换矩阵M之间
有这样的关系
Q等于M的逆再求转置
但在有些特殊的情况下法线变换可以简化
例如平移不影响法线的方向
而旋转变换的矩阵的逆就是它的转置
所以在这种情况下
法线的变换矩阵和模型的变换矩阵是相同的
今天的课程就到这里
谢谢大家
-1.1 课程基本情况介绍
--课程基本情况介绍
-1.2 GPU 相关基础知识
-1.3 OpenGL ES 技术发展历史
-1.4 PowerVR SDK 安装和使用
-第一章测试
-2.1 OpenGL ES 基本概念
-2.2 编写第一个图形程序
-2.3 主要 API 介绍
-第二章测试
-3.1 矢量和矩阵知识基础
-3.2 旋转与位移变换
--旋转与位移变换
-3.3 OpenGL ES 变换基础
-第三章测试
-4.1 着色器编程语言介绍
-4.2 着色器编程实例
--着色器编程实例
-第四章测试
-5.1 颜色的基本概念
--颜色的基本概念
-5.2 纹理素材的使用
--纹理素材的使用
-5.3 立方体纹理
--立方体纹理
-第五章测试
-6.1 光照的基本概念
--光照的基本概念
-6.2 光源模型
--光源模型
-6.3 使用着色器渲染颜色
-6.4 反射与折射
--反射与折射
-第六章测试
-7.1 基于物理渲染的基本概念
-7.2 基于图像的照明
--基于图像的照明
-7.3 PBR 的实现
--PBR 的实现
-第七章测试
-8.1 Vulkan 介绍
-8.2 SDK 中的实用工具介绍
-综合测试