GAMES101 学习4——3D变换,模型,视图,投影

举报
lutianfei 发表于 2022/05/03 12:38:44 2022/05/03
【摘要】 参考资料:https://www.yuque.com/sugelameiyoudi-jadcc/okgm7e/1ee187f999897025b219d35c36826359 一、对于L3的补充,引申 1.1 引申 1.2 从定义看结论:在旋转里面,它的逆=转置。数学上:一个矩阵的逆=转置 →正交矩阵 二、继续讲完3D Translation 2.1 Scale缩放 2.2 Translat...

参考资料:
https://www.yuque.com/sugelameiyoudi-jadcc/okgm7e/1ee187f999897025b219d35c36826359

image.png

一、在旋转里面,矩阵的逆等价于矩阵的转置

image.png

image.png

结论:在旋转里面,矩阵的逆=转置
数学上:一个矩阵的逆=转置 →正交矩阵

二、3D Translation

image.png

image.png

2.1 Scale缩放 和 Translation位移

image.png

2.2 Rotation

2.3.1 绕着坐标轴转

image.png

2.3.2 复杂的旋转→引入欧拉角

可以通过不同轴的旋转次序的组合来达到旋转的效果,所以引入了欧拉角这个概念。
image.png

下图源自维基百科的欧拉角示例图:

注:由于存在旋转组合次序,所以当处于旋转次序中的中间轴一旦由于不当旋转使得它其他某个轴重合时,旋转就会出现扭曲,这种现象称为万向节死锁。而解锁时也会使得旋转插值十分扭曲。常见的解决方法是规定旋转次序、规定某个轴的旋转角度不能超过一定范围、使用四元数旋转。

2.3.3 罗德里格斯旋转公式

任意轴的旋转表示
image.png

具体证明见如下链接:
https://blog.csdn.net/SKANK911/article/details/90056646

注:
a. n是旋转轴,α是旋转角度
b. 默认轴n过原点→不过原点就移到原点再变换,再移回去

2.3.4 四元数

更多的为了旋转间的插值,本课程不讲

三、Viewing transformation(观测变换)

观测变换包括View translation 视图变换Projection Translation 投影变换

3.1 MVP变换(Model、View、Projection)

MVP的理解:

  • Model transformation (placing objects)
    eg:找个好的地方,把所有人集合在一起,摆个pose!(把模型、场景搭好)
  • View transformation (placing camera)
    eg:找一个好的角度/位置,把相机放好,往某一个角度去看。(改变的是相机)
  • Projection transformation
    eg:将三维世界投影到相机底片上,茄子!

3.2 View translation(视图变换)

3.2.1 定义“Camera”

image.png

视图变化本质是通过定义一个摄像机来观察物体,所以该问题也可以转换成如何定义一个摄像机。通常一个摄像机由四个部分组成:

  • 相机位置
  • 相机朝向
  • 相机上轴
  • 相机右轴

但是我们一般只需要前三个分量,因为最后一个右轴就可以通过相机朝向和上轴叉乘得到。

image.png

我们通过相机空间观察物体,一般采用两种方式:

  • 一种是相机动,物体不动;
  • 另一种是物体动,相机不动。
    本课程采用的是第二种方式,并且将相机固定在原点,朝向-z轴,并使上轴与y轴重合

image.png

3.2.2 视图变换的矩阵实现

image.png

image.png

//右边的e/t/g 旋转到左边的xyz去
原始的旋转不好求→先求逆变换(好求)→旋转矩阵的逆(正交矩阵情况下=矩阵的转置)

总结

  • 对象会和相机一起变换(保证相对运动)
  • 模型变换和视图变换经常被一起叫作模型视图变换(Also know as ModelView Translation)

3.3 Projection Translation(投影变换)

投影所做的事是把3D空间物体投影到二维空间,同时通过一个范围约束所有坐标必须处于这段范围内,落到范围外的坐标应该被舍弃掉。

通常这里需要一个投影矩阵,它描述了一个范围的坐标,比如(-100,100)。投影矩阵接着会将在这个指定的范围内的坐标变换为标准设备坐标的范围(-1.0, 1.0)。

通常采用的投影方式有两种,一种是正交投影,另一种是透视投影。

image.png

3.3.1 正交投影

正交投影假设视点无限远,所以构成的范围是一个长方体。它常常需要我们提供长方体的高,宽,近平面距离以及远平面距离。如下图所示:

image.png

如何通过一个长方体 [ l , r ] × [ b , t ] × [ f , n ] [l, r] \times[b, t] \times[\mathbf{f}, \mathbf{n}] 进行正交投影呢?通常有如下步骤:

  1. 固定相机在原点,使其朝向-z,上轴和y重合;
  2. 丢弃z轴;
  3. 把正方体规范化到 [ 1 , 1 ] 3 [-1,1]^{3} ,即先平移,后放缩

image.png

先移动到原点,再缩放
image.png

注:
因为是右手坐标系,所以n>f
OpenGL是左手坐标系。

3.3.2 透视投影

透视投影更像一个近小远大的截体来规定坐标的范围,它更符合人眼成像,即产生近大远小效果,在图形学中也更常见,使用得更多。它通常需要我们提供:

  • 截体的FOV角度
  • 宽高比
  • 近平面距离
  • 远平面距离,如下图所示:

image.png

先回顾一下齐次坐标下的一个概念
image.png

eg:两个表示的都是同一个点(1,0,0)

怎么做透视投影
  • 感性认识:
    • 先“挤”成长方体(①-⑥)
    • 再做一次正交投影(已知)

image.png

规定如下:

  • 近平面上和远平面上Z不变;
  • 远平面中心那个点也不变;
重点:如何挤
  1. 找到挤前和挤后的关系:
    image.png

  2. 在齐次坐标下
    image.png

  3. 到此已经能推出矩阵除了第三行以外的内容
    一个矩阵M 乘以 ( x y z 1 ) \begin{pmatrix} x\\ y\\ z\\ 1 \end{pmatrix} = ( n x n y 不知道 z ) \begin{pmatrix} nx\\ ny\\ 不知道 \\ z \end{pmatrix}
    根据矩阵乘法可以推出1、2、4行分别是什么
    image.png

  4. 接下来解决第三行的问题 → { 近平面和远平面的z都不变 远平面中心点不变  \begin{cases} &\text{近平面和远平面的z都不变} \\ &\text{远平面中心点不变 } \end{cases}

  5. 近平面和远平面的z都不变:
    image.png
    假设z为n,
    那么,矩阵M的第三行 × ( x y n 1 ) \begin{pmatrix} x\\ y\\ n\\ 1 \end{pmatrix} = n 2 ^2 \Longrightarrow 和x,y无关 \Longrightarrow 第三行的前两个数为0
    →可知矩阵M第三行为(0,0,A,B)→An+B=n 2 ^2
    A,B未知

  6. 远平面中心点(0,0,f)不变:
    ( 0 0 f 1 ) \begin{pmatrix} 0\\ 0\\ f\\ 1 \end{pmatrix} 映射还是 ( 0 0 f 1 ) \begin{pmatrix} 0\\ 0\\ f\\ 1 \end{pmatrix} == ( 0 0 f 2 f ) \begin{pmatrix} 0\\ 0\\ f^2\\ f \end{pmatrix}
    同⑤一样,看矩阵M第三行 × ( 0 0 f 1 ) \begin{pmatrix} 0\\ 0\\ f\\ 1 \end{pmatrix} =f 2 ^2 →Af+B=f 2 ^2
    结合⑤和⑥的两个结论:
    An+B=n 2 ^2
    Af+B=f 2 ^2
    两个式子,两个未知数,就可以解出A,B → 解出矩阵M的第三行 → 解出矩阵M

image.png

通过正交投影计算透视投影矩阵:
image.png

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。