|
- 基础变换(仿射变换):旋转、缩放、切变、平移
- 先后顺序很重要,需要仔细想
- 仿射变换=线性变换+平移
- 线性变换=旋转+缩放+切变
- 齐次坐标系:n维的点/向量,用[n+1 x 1]的列向量表示
- 变换用[n+1 x n+1]的矩阵左乘来表示
- 多个变换可以组合起来变成一个矩阵→加速计算
齐次坐标引入:
缩放矩阵
旋转矩阵:
平移:无法表示,所以引入了齐次坐标
向量后面用0,点后面用1, point+point表示中点
使用齐次坐标之后,2维变换可以用三维的矩阵表示
矩阵满足结合律:因此复杂的Transform变化最后都可以写成一个矩阵,矩阵变换分解
用齐次坐标表示:
平移变换对3D 向量没有意义,齐次坐标最后一位是0
3维缩放,平移,旋转矩阵
先绕单个轴旋转:
注意:绕Y轴旋转,和其他不一样,X叉乘Y得到Z,Y叉乘Z得到X,Z叉乘X得到Y,所以是相反的
UE4坐标表示:
3D/2D空间的坐标变换,先进行线性变换,再进行平移变换,
n默认是经过圆心的向量
2、理解模型变换,视图变换,投影变换
模型变换:
模型空间,有时也称B站 脚本刷点赞为对象空间和局部空间,每个模型都有自己独立的坐标空间,当它移动或旋转的时候,模型空间也会跟着它移动和旋转
模型变换也叫世界变换,变换后的坐标也被人称作世界坐标,在变换之前的坐标也被人称为局部坐标。但我上面说了,其实都一样,加这么多坐标系个人感觉有时候会让人混淆。我更喜欢解释为只是模型的位置旋转大小发生了变换而已。
视图变换理解:
如果摄像机和场景的模型,都一起以同一个方式运动,那生成的视图也是一样的,由于生成的视图依赖于摄像机的位置、朝向和其自身的旋转,这样场景中的模型和摄像机之间的相对运动关系就复杂起来了,为了简化处理,考虑将摄像机变换到一个约定俗成的位置,变换过程大致为先将摄像机平移至原点,旋转 g 轴到 -z 轴,再旋转 t 轴到 y 轴,最后将 g x t 旋转到 x 轴,同时这个变换过程在场景中的所有模型也同步进行。约定摄像机标准位置如下:
① 位置在原点,e(0,0,0);
② 朝向坐标轴 -z 轴方向,g = -z;
③ 向上的方向是 y 轴方向,t = y;
④ 场景中模型的变换都围绕原点的摄像机进行;
投影变换:
正交变换:
在摆好模型(模型变换)和找好角度(视图变换)后,需要将场景中的模型投影到二维平面,这个过程就是投影变换。在变换前,先定义所有模型所在空间的描述:f,n—远/近裁剪平面(Z轴坐标范围)、t,b—上下平面(Y轴坐标范围)、l,r—左右平面(X轴坐标范围)。
在Unity 中空间模型如图所示,所有模型只在这个范围内显示,然后计算每个点缩小到范围为[-1,1]的立体空间
变换矩阵为:
透视变换:
摄像机有近平面和远平面,只有在这个范围内的物体 能映射到屏幕上
将远平面压缩到近平面一样,之后再用正交变换
变换矩阵为:
视口变换:
3、旋转矩阵的逆 等于 矩阵的转置
4、对于复合变换,约定变换的顺序就是先缩放,再旋转,最后平移
为什么?
5、视图变换:(找一个好的角度观察)
给定一个观察坐标 eye_pos(x,y,z), 视图变换
[
1, 0, 0, -eye_pos[0],
0, 1, 0, -eye_pos[1],
0, 0, 1, -eye_pos[2],
0, 0, 0, 1
]
6、投影矩阵
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|