GAMES101 Lecture 03 & Lecture 04 Transform
Lecture 03 & Lecture 04 Transform
为什么要变换
- Modeling
- Viewing
2D变换
-
Scale
缩放
缩放矩阵
和 为缩放系数若
,则会关于y轴对称(Reflection) -
Shear
切变
垂直坐标不变,水平坐标向右平移了
上图的切变矩阵
-
Rotate
旋转
(默认绕原点逆时针旋转)
旋转矩阵的推导
绕原点逆时针旋转
若要旋转
- Linear Transforms 线性变换
齐次坐标
- Translation 平移变换
可见平移操作不是线性变换(是仿射变换),为了不让平移操作成为特殊情况,所以引入齐次坐标
-
加入第三个维度
- 2D point
- 2D vector
于是可以将平移变换变为线性变换
-
关于点与向量第三维度差别的理解
-
向量具有平移不变性,所以向量第三维度为0是为了维护平移不变性
-
-
- 2D point
-
齐次坐标变换矩阵
该矩阵有几个特点
- 左上角
为线性变换系数 - 右上角
为平移系数 - 在表示二维情况下仿射变换时最后一行为
- 左上角
-
逆变换
将A变换到B后,再将B变换回A称为逆变换,在数学上,逆变换表现为乘于原变换矩阵的逆矩阵
组合变换
组合变换需按照RST顺序(Rotate Scale Translate),否则会发生畸变
在数学上,表现为矩阵相乘的顺序不同意义不同
-
在OpenGL中,向量为列向量,按一下顺序相乘
-
在DirectX中,向量为行向量 ,按以下顺序相乘
以任意一点c为中心变换
- 先将所有点都移动
(向量) - 再进行旋转
- 最后将所有点移动
(向量)
3D变换
类比2D变换
-
3D point
-
3D vector
-
-
矩阵表示仿射变换- 左上角
矩阵为线性变换矩阵 - 右侧
矩阵为平移矩阵 - 最下面一行为
(仿射变换时)
- 左上角
-
绕
轴旋转于是可以将复杂的旋转分解成绕
轴的旋转(也被称为欧拉角)可以以飞机的翻滚、俯仰、偏航来理解
旋转矩阵并不适合插值,可以用四元数
View Transfomation
View(视图)/Camera transfomation
-
Model transfomation
将顶点坐标从模型空间变换到世界空间
-
View transfomation
将顶点坐标从世界空间变换到相机空间
定义相机处于原点,上方向为
相当于以相机为中心建立了一个坐标系(相机空间)
通过
-
将
平移到原点(世界空间原点) -
将
旋转至将
旋转至将
旋转至(不好写)
-
反过来旋转
将$X$旋转至$(g\times t)$
将$Y$旋转至$t$
将$Z$旋转至$-g$
$R_{view}^{-1}=\begin{bmatrix}x_{\widehat g \times \widehat t} & x_t & x_{-g} & 0\\y_{\widehat g \times \widehat t} & y_t & y_{-g} & 0\\z_{\widehat g \times \widehat t} & z_t & z_{-g} & 0\\0 & 0 & 0 & 1\end{bmatrix}$
$R_{view}=\begin{bmatrix}x_{\widehat g \times \widehat t} & y_{\widehat g \times \widehat t} & z_{\widehat g \times \widehat t} & 0\\x_t & y_t & z_t & 0\\x_{-g} & y_{-g} & z_{-g} & 0\\0 & 0 & 0 & 1\end{bmatrix}$
求得逆变换,再求逆得到我们要的旋转矩阵,
而旋转矩阵又是正交矩阵,所以对其转置则为其逆矩阵
配合前面求的
-
Projection transfomation
将顶点坐标从相机空间变换到裁剪空间
Projection(投影) transfomation
Orthographic(正交) projection
并不正式的做法(方便理解)
-
将相机置于原点,看向
轴,上方向为 -
去掉
坐标 -
将结果矩形框平移和缩放至
为什么是
?这是一个约定俗成的做法,方便后续的计算
正式的做法
-
定义一个立方体,将这个立方体映射到canonical(正则、规范、标准) cube
-
这里深度范围视api而定
-
这里的立方体长宽高依据我们要渲染的范围自己决定
-
-
先进行平移,再进行缩放
-
这里保留了深度坐标,方便用于计算遮挡
*精度上会有问题
Perspective(透视) projection
在欧氏几何中定义平行线永不相交,但在透视投影的情况下,相当于一个平面投影到另外一个平面下,这种情况就不是永不相交了
-
定义一个视锥体(近平面、远平面)
-
将视锥体“挤压”成长方体
- 规定近平面永远不变,近平面上的任何点不变
- 规定远平面上任何点的深度不变
-
从侧面看,可以根据相似三角形算出
-
同理
-
透视矩阵
-
对于在近平面和远平面之间的点,经过挤压变换,它们的深度被推向的远平面
(此处
轴方向是右手系的原因)这个结论也可以用常识来理解,所有点都向着远平面压缩(离摄像机近的部分少,远的部分多),造成近大远小的现象
定义视锥体
-
FOV(field of view)垂直可视角度
-
长宽比(aspect ratio)
通过
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)