Games101 04 - 坐标空间、MVP变换

目录

 1.Coordinate space 坐标空间

1.1 为什么有各式各样的坐标空间?

1.2 Model space 模型空间

1.3 World space 世界空间

1.4 View space 视图空间

1.5 Clip space 裁剪空间

2. DTransformations in homogeneous coordinates

2.1 Rotation

2.1.1 欧拉角与万向锁

2.2 Translation

2.3 scale

3. Model-View-Projection 变换

3.1 Model transformation 模型变换-放置物体

3.2 View(camera) transformation 视图变换-摆放相机

3.3Projection transformation 投影变换-按下快门

3.3.1 Orthographic Projection 正交投影

3.3.2 Perspective Projection 透视投影

3.3.2.1 求挤压矩阵

3.3.2.2 挤压变换后Z为什么变大(物体变远):


 1.Coordinate space 坐标空间

1.1 为什么有各式各样的坐标空间?

  1. 在研究特定问题时使用特定的坐标空间可以简化问题

  2. 变换即矩阵强调“过程”的另一种说法,本质都是改变当前坐标系的基向量,所以任意一个矩阵(变换)都会改变当前的坐标空间

1.2 Model space 模型空间

又称本地坐标系,在Unity中,模型空间和世界空间默认的是左手坐标系,原点一般是模型的几何中心,可在建模软件中修改。

1.3 World space 世界空间

又称全局坐标系,原点位于场景的某个位置并保持不变

1.4 View space 视图空间

又称相机坐标系,在Unity中是右手坐标系(相机会朝向-z方向从而造成Z值远小于近,但XY轴都是远大于近,这很别扭。OPENGL正是因为这点所以用左手系,但是又会造成X叉乘y不再等于Z而是-Z)。如果视图空间的原点需要改变的同时又不希望场景变化需要对场景中的所有物体应用同一个矩阵以实现相对运动。

1.5 Clip space 裁剪空间

希望用视锥体围成的区域对图元进行裁剪,但是如果直接用视锥体来定义裁剪空间,不同的视锥体就要定义不同的处理过程,而且对于透视状态下的视锥体,判断一个顶点是否在视锥体内很困难,所以需要一个更通用的空间进行判断。所以需要将视图空间通过正交投影矩阵 / 透视投影矩阵变换为裁剪空间,才好对图元进行裁剪和剔除


2. DTransformations in homogeneous coordinates

2.1 Rotation

笛卡尔坐标系下,绕x,y,z轴旋转 α 角度的变换矩阵分别给出如下:

已知xy能求z,给yz能求x,这叫循环对称。y是由z叉乘x得到而不是xz,所以得出绕y轴旋转的矩阵是转置的。

Y取反因为是Unity中是左手坐标系。在X轴上左比右小,y轴下比上小,Z轴却是远小于近,这是为了保证右手坐标系所以沿-Z方向看的,而OPENGL正是因为这点所以用左手系,但是会造成X叉乘y不再等于Z而是-Z,所以如果坐标相反是正常现象,因为用的不是同一个坐标系

2.1.1 欧拉角与万向锁

任意旋转能用3个旋转分量的复合矩阵表示

 

  • 绕X轴旋转,即绕pitch(俯仰角)旋转
  • 绕Y轴旋转,即绕yaw(航向角)旋转
  • 绕Z轴旋转,即绕roll(翻滚角)旋转

在Unity3D中固定使用Z->X->Y这套旋转顺序,UE4中使用左手系Z-up坐标系,按Z->Y->X的旋转顺序,两者都可以,但只要中固定的一个顺序来编码旋转或者朝向,而j就会导致GimbalLock的问题:假设我们使用𝑥-𝑦-𝑧的顺序旋转任意一个点

当前的𝑧轴与原来的𝑥轴重合,也就是说,最后𝑧轴的旋转与𝑥轴的旋转 其实操纵的是同一个轴,一旦𝑦轴上的变换角将这 两个旋转轴对齐,我们就没有任何办法对最初的𝑧轴进行旋转了.无论𝑥 轴与𝑧轴的旋转角是多少,变换都会丧失一个自由度GimbalLock问 题的核心还是在于我们采用了固定的旋转顺序

解决方案:

1.在最内部添加一个𝑥轴Gimbal,或者说在变换序列的最后再添加一个𝑥轴的旋转变换,不能从一开始的时候也可以选择采用四个Gimbal的设计,但是这仍不能完全解决问题, 因为除了𝑦轴之外其它轴的旋转仍然可能将其中的两个轴或者三个轴对 齐,只不过现在GimbalLock产生的几率可能会变小而已。

2.四元数:在另一篇博客中有详细介绍

对于更一般的情形,绕起点为原点、方向向量为 n=(nx,ny,nz) ( n 为单位向量)的轴旋转的矩阵可由罗德里格斯旋转公式给出:(如果n不经过原点则平移到原点进行旋转再将n移回原位)

ps:I是3×3单位矩阵,n是在n坐标系下各个基底的单位向量

最后的向量的叉乘的矩阵形式,表示这里运用某个叉乘。

得到旋转矩阵R后,利用公式​可将齐次坐标(x,y,z,w)绕指定轴旋转 α 角度得到 (x′,y′,z′,w) 。可以看出,齐次坐标中的 w 在旋转变换前后不变,且不影响其他坐标的值。

2.2 Translation

其中, w=0 时表示平移对象为向量,由于向量只与相对位置有关,故平移前后不发生任何变化。 w=1 时表示平移对象为点,且位移量分别为 Δx,Δy,Δz 。w 为其他值时可先化为 1 再进行平移。

2.3 scale


3. Model-View-Projection 变换

将三维空间中的显示到二维显示屏的变换:把顶点坐标从:局部坐标(局部空间) → 世界坐标 → 观察坐标 → 裁剪坐标 →屏幕坐标

3.1 Model transformation 模型变换-放置物体

顶点坐标从模型空间 → 世界空间,这个矩阵是随着物体的运动而改变的。

通过将局部空间的坐标点乘一个变换矩阵来得到他在世界空间的位置

Model矩阵可以拆分成Translate、Rotate和Scale三个矩阵的点乘

对顶点依次进行了:缩放→旋转→平移,因为矩阵乘法不具有交换律因此顺序不能改变


3.2 View(camera) transformation 视图变换-摆放相机

把camera放在世界坐标的原点,Look at -Z,up at Y世界空间 → 视觉空间(以camera为中心的空间坐标系)

1.平移:通过平移矩阵将camera移动到世界空间的原点位置(”约定俗成”的位置)

2.旋转:通过旋转矩阵将相机的朝向和头顶朝向设置为-Z,Y,两者的叉乘的方向朝向为X。但从某个向量旋转到标准的XYZ轴对应的矩阵不好写,但其逆矩阵即从XYZ旋转到对应的向量的矩阵很好写,又因为旋转矩阵是正交矩阵,其逆矩阵等于矩阵的转置

注意旋转Y轴要取反,因为是左手坐标系

  • 如果摄像机和物体同时应用改变换就可以保证照片不变

  • 可知两种变换运用的矩阵是相同的,所以合称为MVP中的MV - model view transformation,两个变换都是在给投影变换做准备

3.3Projection transformation 投影变换-按下快门

视觉空间→裁剪空间(判断顶点是否在可见范围内,(看不到的没必要处理)

注意:p矩阵并不是真正的做投影,而是为投影做准备。

视锥体分为两种投影,一种是正交投影(orthographic projection),一般在2D游戏或渲染小地图中使用。第二种是透视投影(perspective projection),一般在3D中广泛使用,而他们所对应的投影矩阵也不相同。

3.3.1 Orthographic Projection 正交投影

正交投影没有”近大远小“(将摄像机拉的无限远,这样两个clip的大小就近乎没有区别)

1.把长方形视锥体的中心坐标平移到原点。右+左 / 2,-是因为要移动到原点

2.再应用缩放矩阵缩放到(-1,1),也就是映射到(-1,1)的三次方。移动到长宽为1是为了在适配各种分辨率屏幕时方便计算,比如1280×720。对应边与分母消后剩下的2即为缩放后的长度,左右各占一半。

3.3.2 Perspective Projection 透视投影

1.(要求远平面的中心不变化,内平面没有任何变化)应用Mpersp ->ortho矩阵将Frustum挤压为Cubiod,将远平面向内挤压至与内面大小一致。

2.再做一次正交投影

计算结果如下:

3.3.2.1 求挤压矩阵

推导过程,可选择跳过

将y’和y、x‘和x的关系代入挤压变换后的点坐标中,再利用齐次坐标(x,y,z,1)与(x/w,y/w,z/w,w)表示同一个点的特征将前两行的未知量Z消去,Z表示远视面和近视面之间某点到相机位置的Z坐标差。是对于每一个平面的,而Z和Z’的关系我们现在还不清楚,只有远近两个平面上的点保持不变,之间的点并非不变而会变远(离远视面更近,Z变的更大),关于这点后面会从2点给予证明。

根据相似关系找到的变换前后的XY坐标关系可以完成挤压矩阵的一部分

再根据1.任何近视面的点的坐标在挤压变换前后不变,2.任何远视面的点Z坐标不会变,即可推出第三行

  • 为什么代入n而不是其他数?

本质上只要求z按顺序重新映射即可,不存在精确值,因为投到2d平面了,只要确保远近顺序不变即可。所以只需凑一个好算的特殊值,你要n的5次6次都可以,但是不好算。简单来讲就是根据透视投影中观测到的性质,通过 z(近n 远f) 先得到 x,y 的映射关系,填充到矩阵里,然后取两个特殊点填充完矩阵。这是凑合理性,不是证明唯一合理性

  • 为什么齐次坐标最后一行的第3个数是1而不是最后1个,就像之前的仿射变换一样?

虎书:

这个向内挤压的操作无法通过仿射变换实现,因为输入向量的坐标出现在分母中

之前通过使用0001作为仿射变换(平移(Translation)、缩放(Scale)、翻转(Flip)、旋转(Rotation)和剪切(Shear)矩阵第四行

如果我们允许变换矩阵的底行有任何值,则可以实现更大范围的变换,从而使w取1以外的值

2.经验角度:

假设图中的铁轨可能有100m长,但实际你能感觉到图片的后半部分占据了大约80米的长度,这说明在投影变换到屏幕的过程中,点都在向远处移动。


Quote:

Games101课程

3B1B的线性代数课程

计算机图形学 5:齐次坐标与 MVP 矩阵变换 - 知乎 (zhihu.com)

https://krasjet.github.io/quaternion/bonus_gimbal_lock.pdf

3D数学:欧拉角、万向锁、四元数 - HighDefinition - 博客园

透视投影 中间 Z 变大还是变小_透视投影不变z值-CSDN博客

尾言:

还有许多很久以前记的笔记但不确定出处如有知道出处的朋友可以告诉我,仅供学习如有侵权我会及时删除

都看到这里啦,欢迎加群一起进一步交流游戏制作相关的技术哦!群:1005869797

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值