GAMES101-04- Transformation Cont
Transformation Cont
上节课补充
对于旋转操作,旋转角度为,则矩阵可以写为:
那么旋转角度为-时,矩阵怎么表示呢?
答:由于 ,所以从式子变换可看出
而从定义的角度可看出,。
那么就可以得到一个有趣的关系,,满足这样式子的矩阵也叫正交矩阵。
3D transformation
3D变换的基本概况
三维的变换都可以用二维的变换来类比,那么三维也引入齐次坐标,那么其表示形式可以写为:
同理,对点的定义操作如下:
当然,写也是对的,这样就是用四个数来表示三维空间的点。
那么三维空间也可以用4x4的矩阵来表示(仿射变换的情况下,矩阵的最后一行就是0,0,0,1):
思考,在上式写成4x4矩阵形式的时候,是先考虑线性变换呢,还是先考虑平移呢?
答:同二维空间一样,是先线性变换再平移。
3D变换的旋转表示
考虑三维空间下的旋转,分别是按x轴,y轴和z轴旋转α度,则对应的旋转矩阵如下:
为什么的矩阵表示形式跟和不一样呢?
答:观察可以看出,绕y轴的结果刚好跟绕x和z轴的方向是反的。因为绕y轴旋转的理解跟绕x和z轴旋转的理解不太一样。因为矩阵有旋转对称性,所以对于xyz坐标系来说,利用右手螺旋定理,x叉乘y得到z,y叉乘z得到x,而z叉乘x得到-y,这是跟y是反的,所以旋转矩阵的表示形式会跟绕x轴和绕z轴不太一样。
那么任意的复杂旋转都可以用简单的绕轴旋转来实现吗?
答:是的。式子表示的意思就是任意的旋转都写成绕x,y,z轴的旋转的组合。(α,β,γ在数学上被称为欧拉角)
而旋转转换为绕轴旋转的方程式(罗德古斯旋转方程式)表示如下:
这个公式在干什么呢?
答:它给了我们一个定义旋转轴为向量n的旋转矩阵,但直接这样定义并不严谨,毕竟向量要确定起点和方向才对,实际上这是默认了这个向量是过原点的,这样的话这个向量就是起点在原点,方向为n这个方向,旋转角度为α,
Viewing观测 transformation
在介绍之前,先用拍照类比一下变换的过程:
- 找到一个好地方,安排好拍照的人员和动作=model transformation
- 找到一个好角度进行拍摄=view transformation
- 按下快门=projection transformation
view视图 transformation
像前面说的,视图变换等同于在摆相机,那么相关重点就有position位置、gaze direction看的角度、up direction向上方向。
向上方向是什么呢?怎么理解呢?
答:假设在相机上插根竖直的草,不改变相机看的角度,左右扭转相机,那么此时相机上插着的草所指向的方向就是向上方向。
Key observation
当用同样的方式移动相机和物体的时候(也就是,保证两者的相对位置时),得到的结果会是一样的。
既然这样的话,我们就可以定义相机的位置永远不变,就定相机的标准位置就在原点,相机永远往-z的方向看,相机永远以y轴为向上方向。
也可以用向量表示如下:
为什么要这样定义呢?
答:这样做可以让操作简化。
数学表示
视图变换记作,这个变换可以由先平移变换再旋转变换的操作表示为。
- 表示平移变换,对上原点
-
表示做旋转变换
我们希望对应-z轴方向,对应y轴方向,对应x轴方向这样来调整,但是这样难以表示,所以反向思考,我们可以让x轴对应方向,y轴对应方向,z轴对应方向,这样对应的旋转矩阵可以表示如下:
这个时候用到笔记一开始的内容,旋转矩阵是正交矩阵,满足,所以已知,那么就可以用得到。
projection投影 transformation
投影有几种方式,一是3D到2D的投影,二是正交投影,三是透视投影。这里主要讲后两种投影方式。
首先从下图区别后两种投影方式:
左边这图,怎么看线都是平行的。而右边这图,线延长后会发现线会相交于某点。
那么这两个投影有什么本质区别呢?
答:正交投影不会带来近大远小的现象,而透视投影会带来近大远小的现象。
再举个例子,下图种透视投影的相机看作是一个点,而正交投影假设的就是相机离得无限远。
orthographic正交projection
-
定义一个长方体,其实就是定义各边对应三个轴的数值
-
将长方体的中心对应原点
-
进行缩放,从而把长方体转变为标准立方体
怎么做——变换矩阵
、、是为了实现平移,对应原点。
、、是为了实现缩放,使得各轴范围就是[-1,1]。
那么进行缩放处理后,物体会被拉伸吗?
答:会被拉伸,但是在所有变换结束后,还会进行视口变换,此时还会进行一次拉伸,所以此时缩放被拉伸不是什么问题。
perspective透视projection
透视投影带来的效果就是平行线不再平行。
review 齐次方程
怎么做
透视投影是一个点延伸出来四棱锥,定义一个近和远,服从近大远小的规则。
对透视投影的处理分为两步:
- 将frustum压缩为cuboid()
也就是考虑把后面的投影面在平面内向里进行压缩,压缩成跟前一个面一样大小。(规定近平面不发生变化且远平面的中心点也不发生变化)
怎么压缩远平面呢?
答:
第一步——考虑学过的知识,找到下图中点与点的关系,即对y挤压有的关系,同理,对x挤压有的关系。
也就是说,对于变换过程的齐次方程来说,肯定存在一个矩阵,使得该矩阵左乘以下图左侧的必然得到,再对该矩阵处理得到。
即,必然可以映射到右边这个向量。
故左乘的式子可写为:
因此,我们可以写出部分的如下满足上面映射关系:
第二步——结合条件1(近平面点不变),假设z为n,那么得到下图式子:
此时就可以考虑特殊情况,的第三行设为左乘会得到,即:
为什么第三行设为呢?
答:因为等号右侧的矩阵第三行为不包含和(也就是跟和无关),所以第三行的前两列都要设为0,而后两列说不准,所以只能将第三行设为。
此时得到一个方程,。
第三步——考虑条件2(远平面z不变),此处特别考虑远平面的中心点,那么这个点的映射关系如下:
此时也得到一个方程,。
结合第二步和第三步的方程式,我们可以解得。
最终得到完整的。
在这节课的最后提出一个问题,Frustum中n和f处的z是不变的,那么考虑在n和f之间的某个z’的截面在远平面进行压缩时z‘是否会改变?(而这个n和f其实是往-z轴方向看的,所以要注意——n其实是大于f的)
- 做正交投影()
由于正交投影,上方已经解出,所以这部分就不再记录了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!