GAMES101 Lecture 03 & Lecture 04 Transform

Lecture 03 & Lecture 04 Transform

为什么要变换

  • Modeling
  • Viewing

2D变换

  • Scale

    缩放

    缩放矩阵

    [xy]=[sx00sy][xy]

    sxsy为缩放系数

    sx=1,sy=1,则会关于y轴对称(Reflection)

  • Shear

    切变

垂直坐标不变,水平坐标向右平移了ay

[xy ]=[1a01][xy]

上图的切变矩阵

  • Rotate

    旋转

    (默认绕原点逆时针旋转)

    旋转矩阵的推导

Rθ=[cosθsinθsinθcosθ]

绕原点逆时针旋转θ角度的旋转矩阵

若要旋转θ角度,则Rθ=[cosθsinθsinθcosθ]=RθT=Rθ1()()

  • Linear Transforms 线性变换

    x=ax+byy=cx+dy[xy]=[abcd][xy]x=Mx

齐次坐标

  • Translation 平移变换

[xy]=[abcd][xy]+[txty]

可见平移操作不是线性变换(是仿射变换),为了不让平移操作成为特殊情况,所以引入齐次坐标

  • 加入第三个维度

    • 2D point =(x,y,1)T
    • 2D vector =(x,y,0)T

    (xyw)=(10tx01ty001)(xy1)=(x+txy+ty1)

    于是可以将平移变换变为线性变换

    • 关于点与向量第三维度差别的理解

      • 向量具有平移不变性,所以向量第三维度为0是为了维护平移不变性

      • +==+=+=??+=(xyw)=(x/wy/w1)

  • 齐次坐标变换矩阵

    (xy1)=(abtxcdty001)(xy1)

    该矩阵有几个特点

    • 左上角abcd为线性变换系数
    • 右上角tx,ty为平移系数
    • 在表示二维情况下仿射变换时最后一行为001001
  • 逆变换

    将A变换到B后,再将B变换回A称为逆变换,在数学上,逆变换表现为乘于原变换矩阵的逆矩阵

组合变换

组合变换需按照RST顺序(Rotate Scale Translate),否则会发生畸变

在数学上,表现为矩阵相乘的顺序不同意义不同

  • 在OpenGL中,向量为列向量,按一下顺序相乘

    TSR(xy1)xA1A2A3...AN(...A2(A1(x)))=An...A2A1(xy1)()

  • 在DirectX中,向量为行向量 ,按以下顺序相乘

    (xy1)RSTxA1A2A3...(((x)A1)A2...)AN=(xy1)A1A2...An()

以任意一点c为中心变换

  1. 先将所有点都移动c(向量)
  2. 再进行旋转
  3. 最后将所有点移动c(向量)

3D变换

类比2D变换

  • 3D point =(x,y,z,1)T

  • 3D vector =(x,y,z,0)T

  • (x,y,z,w)=(x/w,y/w,z/w,1) (w!=0)

  • 4×4矩阵表示仿射变换

    (xyz1)=(abctxdeftyghitz0001)(xyz1)

    • 左上角3×3 矩阵为线性变换矩阵
    • 右侧3×1矩阵为平移矩阵
    • 最下面一行为0001(仿射变换时)
  • xyz轴旋转

    Rx(α)=(10000cosαsinα00sinαcosα00001)Ry(α)=(cosα0sinα00100sinα0cosα00001)z×xyyRz(α)=(cosαsinα00sinαcosα0000100001)

    于是可以将复杂的旋转分解成绕xyz轴的旋转(也被称为欧拉角)

    Rxyz(α,β,γ)=Rx(α)Ry(β)Rz(γ)

    可以以飞机的翻滚、俯仰、偏航来理解

    旋转矩阵并不适合插值,可以用四元数

    RodriguesRotationFormulaI沿αR(n,α)=cos(α)I+(1cos(α))nnT+sin(α)(0nznynz0nxnynx0)n

View Transfomation

View(视图)/Camera transfomation

  • Model transfomation

    将顶点坐标从模型空间变换到世界空间

  • View transfomation

    将顶点坐标从世界空间变换到相机空间

定义相机处于原点,上方向为y轴, 看向z轴负向(OpenGL等右手系,DirectX为左手系,看向z 轴正向)

相当于以相机为中心建立了一个坐标系(相机空间)

通过Mview矩阵变换相机Mview=RviewTview(右手系从右往左乘)

  • e平移到原点(世界空间原点)

    Tview=[100xe100ye100ze0001]

  • g旋转至Z

    t旋转至Y

    (g×t)旋转至X

    (不好写)

  • 反过来旋转

将$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}$

求得逆变换,再求逆得到我们要的旋转矩阵,

而旋转矩阵又是正交矩阵,所以对其转置则为其逆矩阵

配合前面求的Tview则可求得Mview,完成视图变换

  • Projection transfomation

    将顶点坐标从相机空间变换到裁剪空间

Projection(投影) transfomation

Orthographic(正交) projection

并不正式的做法(方便理解)
  • 将相机置于原点,看向Z轴,上方向为Y

  • 去掉Z坐标

  • 将结果矩形框平移和缩放至[1,1]2

    为什么是[1,1]

    这是一个约定俗成的做法,方便后续的计算

正式的做法

  • 定义一个立方体,将这个立方体映射到canonical(正则、规范、标准) cube[1,1]3

    • 这里深度范围视api而定

    • 这里的立方体长宽高依据我们要渲染的范围自己决定

  • 先进行平移,再进行缩放

    Mortho=[2rl00002tb00002nf00000][100r+l2010t+b2001n+f20001]

  • 这里保留了深度坐标,方便用于计算遮挡

*精度上会有问题

Perspective(透视) projection

在欧氏几何中定义平行线永不相交,但在透视投影的情况下,相当于一个平面投影到另外一个平面下,这种情况就不是永不相交了

  • 定义一个视锥体(近平面、远平面)

  • 将视锥体“挤压”成长方体

    • 规定近平面永远不变,近平面上的任何点不变
    • 规定远平面上任何点的深度不变

  • 从侧面看,可以根据相似三角形算出y=nzy

  • 同理x=nzx

  • (xyz1)=>(nx/zny/zunknow1)==(nxnystillunknowz)Mpersp>ortho4×4(xyz1)=(nxnystillunknowz)Mpersp>ortho4×4=(n0000n00????0010)(xyn1)=>(xyn1)==(nxnyn2n)使xy0(00AB)(xyn1)=n2An+b=n2(0,0,f,1)(00f1)=>(00f1)==(00f2f)Af+B=f2{An+b=n2Af+B=f2{A=n+fB=nf

透视矩阵

Mpersp>ortho4×4=(n0000n0000n+fnf0010)

  • 对于在近平面和远平面之间的点,经过挤压变换,它们的深度被推向的远平面

    Mpersp>ortho4×4(xyz1)=(n0000n0000n+fnf0010)(xyz1)=(nxnyz(n+f)nfz)=(x/zy/z(n+f)nf/z1)z=(n+f)nfzzz=(n+f)nfz2zf(z)=(n+f)nfz2z=nz=ff(z)=0f(z)线

    (此处z 轴方向是右手系的原因)

    z(f,n),zz>0zz<0

    这个结论也可以用常识来理解,所有点都向着远平面压缩(离摄像机近的部分少,远的部分多),造成近大远小的现象

定义视锥体
  • FOV(field of view)垂直可视角度

  • 长宽比(aspect ratio)

    Aspect ratio=width/height

tanfovY2=t|n|aspect=rt

通过FOV|n|就可以计算出远近、左右、上下

posted @   Telluluu  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示