图形学渲染基础(1)变换(Transformation)

2,515 阅读4分钟

模型变换(Modle Transformation)

模型变换:3D空间中的物体,通过伸缩、旋转和平移等操作来变化该物体大小及位置等信息,使其符合设计创造的需求。在实际的操作要求中,通常按照伸缩->旋转->平移的顺序进行,这样的操作顺序更方便矩阵的构建与计算的处理。

2D变换(2D transformations)

  • 伸缩(Scale) QQ截图20210809130408.png
  • 剪切(Shear) QQ图片20210809130814.png
  • 旋转(Rotate) QQ截图20210809131348.png 所有的旋转矩阵是正交矩阵,因此它的逆矩阵即为转置矩阵,几何上可以这样理解:一个向量饶原点逆时针旋转30度的转置便是顺时针旋转30度。
  • 仿射(Affine) QQ截图20210809131732.png 仿射变换=线性变化+平移操作,这里可以看出仿射操作并不是线性变换,因此引出了齐次坐标系的概念,让所有的变换操作都可以用一个矩阵表示。

齐次坐标系(Homogeneous Coordinates)

  • 3Dpoint=(x,y,z,1)T :齐次坐标的w分量为1时,该向量视为点(x,y,z)
  • 3Dvector=(x,y,z,0)T :齐次坐标的w分量为0时,该向量视为向量(x,y,z)
  • 3Dpoint=(xw,yw,zw,w)T :齐次坐标的w分量不为0时,该向量视为向量(xw/w,yw/w,zw/w)
  • point - point =vector
  • vector + vecotr =vector
  • point + vetor = point
  • point + point = mid point(中点) 在齐次坐标系下,可以将对向量的变换矩阵相乘表示:Acompose=A1A2A3...,并且仿射变换也可以用一个矩阵表示 QQ截图20210809134101.png

3D变化(3D transformations)

  • 伸缩(Scale) QQ截图20210809134741.png
  • 旋转(Rotate) QQ截图20210809134801.png
绕向量n旋转α弧度角,
R(n,α):n为起点在原点的向量,α为旋转角度
I:单位矩阵
  • 平移(Translate) QQ截图20210809134749.png

摄像机变换(Camera Transformation)

世界空间坐标可经过视图变换得到观察空间坐标。视图变换可理解为将物体的世界坐标系位置(包括角度)转换成在摄像机坐标系的位置(包括角度),换句话说就是求物体相对于摄像机的位置(包括角度)。得到相对位置后就会更加容易的获得物体的深度关系方便后期的渲染。 1409576-20210304085657132-1232717643.png 我们只需要首先将相机平移到原坐标原点,然后进行旋转操作。对于这两个变换的矩阵求解我们可以利用逆矩阵,简化了大量操作。

投影变换(Projection Transformation)

观察空间的坐标通过投影变换得到裁剪空间(Clip Space)的坐标。投影变化则可理解成将3D空间中的坐标转换成在投影面上的坐标,即将三维空间上的东西投影在我们最终呈现画面的投影面。 QQ截图20210809150029.png

正交投影(Orthographic Projection)

正交投影可以理解成平行投影,可以将物体等大小投影到屏幕上,实际操作通常是将摄像机所照射的长方体映射到规范立方体上面,实际操作可简化为两个步骤: QQ截图20210809152553.png

  • 将长方体中心移动到原点
  • 将长方体拉伸成规范立方体[-1,1]³ QQ截图20210809152711.png 其中l、r为视景体在x轴上的最大值、最小值,t、b为在y轴上的最大值、最小值,f、n为在z轴上的最大最小值

透视投影(Perspective Projection)

投射投影符合现实人眼的投影方式,典型特征就是近大远小,大部分3D游戏使用的都是透视投影方式。透视投影的实际操作也只有两个步骤 QQ截图20210809153107.png

  • 将截锥体压缩成长方体
  • 进行正交投影 QQ截图20210809153502.png 可以根据三角形相似原理以及远近面z值不变,得到变换矩阵 QQ图片20210809153655.png 由于上述的正交变换矩阵是已知的,Mpersep=MorthoMpersp−>ortho,最终的透视变换矩阵如下 QQ截图20210809153858.png

视口变换(viewport transformation)

视口变换负责把裁剪空间上的坐标(范围[-1,1],范围[-1,1])映射到屏幕坐标(范围[0,width],范围[0,height]),这就需要先定义屏幕分辨率的大小(例如:width=1200,height=1080)

裁剪空间坐标的x和y也被称为 标准化设备坐标(NDC)
这是因为其值范围均为[-1,1],可以消除对屏幕纵横比的依赖,之后只需要通过视口变换便可以拉伸到合适的屏幕分辨率

QQ截图20210809154339.png

总结

MVP变换: 
    模型变换(Model Transformation):模型空间坐标->世界空间坐标 
    摄像机变换(Camera Transformation):世界空间坐标->观察空间坐标 
    投影变换(Projection Transformation):观察空间坐标->裁剪空间坐标 
视口变换(Viewport Transformation):裁剪空间坐标->屏幕空间坐标 
V′=Mviewport * Mpersepctive * Mview * Mmodel * V
有了以上变换之后,我们可以任意将一个3D模型坐标映射在最终呈现画面的屏幕上,即得到屏幕空间坐标。

参考