3D数学之变换

变换的分类

 

 

 

变换的实现方式

  • 变换坐标
  • 变换坐标系

对比:各有利弊,比如有可能直接变换物体坐标计算量大,那么就可以使用变换坐标系代替。

 

 

常见的变换

注:非特殊说明变换空间均为左手坐标系。

平移

平移矩阵:

\begin{bmatrix} 1& 0& 0& t_{x}\\ 0& 1& 0& t_{y}\\ 0& 0& 1& t_{z}\\ 0& 0& 0& 1 \end{bmatrix}

注:平移矩阵不是正交矩阵。

 

旋转

绕x轴旋转:

\begin{bmatrix} 1& 0& 0& 0\\ 0& \cos\Theta & -\sin\Theta & 0\\ 0& \sin\Theta& \cos\Theta&0\\ 0& 0& 0& 1 \end{bmatrix}

绕y轴旋转:

\begin{bmatrix} \cos\Theta& 0& \sin\Theta& 0\\ 0& 1 & 0 & 0\\ -\sin\Theta& 0& \cos\Theta&0\\ 0& 0& 0& 1 \end{bmatrix}

绕z轴旋转:

\begin{bmatrix} \cos\Theta& -\sin\Theta& 0& 0\\ \sin\Theta& \cos\Theta & 0 & 0\\ 0& 0& 1&0\\ 0& 0& 0& 1 \end{bmatrix}

注:旋转矩阵是正交矩阵。

 

缩放

缩放矩阵:

\begin{bmatrix} k_{x}& 0& 0& 0\\ 0& k_{y}& 0& 0\\ 0& 0& k_{z}&0\\ 0& 0& 0& 1 \end{bmatrix}

注:

  • 缩放矩阵一般不是正交矩阵。
  • k = 0时,就是正交投影。
  • k < 0时,就是镜像。

 

正交投影

正交投影矩阵(右手坐标系)

\begin{bmatrix} \frac{1}{Aspect\times Size}& 0& 0& 0\\ 0&\frac{1}{Size}& 0& 0\\ 0& 0& -\frac{2}{Far -Near}&-\frac{Far + Near}{Far -Near}\\ 0& 0& 0& 1 \end{bmatrix}

其中:

  • Size:视锥体竖直方向上高度的一半。
  • Aspect:摄像机的横纵比,即裁剪面的宽/高。
  • Far:近裁剪面与摄像机的距离。
  • Near:远裁剪面与摄像机的距离。

注:

  • 在某个方向上用0做为缩放因子,就可以实现正交投影。
  • 原来的点到投影点的直线相互平行。
  • 如果矩阵行列式为0,则矩阵包含投影。
  • 正交投影与正交矩阵没有关联。

视锥体示意图:

 

透视投影

透视投影矩阵(右手坐标系)

\begin{bmatrix} \frac{\cot\frac{FOV }{2}}{Aspect}& 0& 0& 0\\ 0& \cot\frac{FOV }{2}& 0& 0\\ 0& 0& -\frac{Far +Near}{Far -Near}&-\frac{2\times Far \times Near}{Far -Near}\\ 0& 0& -1& 0 \end{bmatrix}

其中:

  • FOV:Field of View的缩写,表示摄像机上下张开的角度大小。
  • Aspect:摄像机的横纵比,即裁剪面的宽/高。
  • Far:近裁剪面与摄像机的距离。
  • Near:远裁剪面与摄像机的距离。

注:

  • 透视投影中原来的点到投影点的直线相交于一点。

参考链接:

透视投影矩阵的推导:https://blog.csdn.net/u013244147/article/details/88760626

 

镜像(反射)

  • 缩放因子小于0即可实现镜像
  • 如果矩阵行列式为负,则矩阵包含镜像。

 

切变(扭曲)

定义:角度发生变换,但面积和体积保持不变。

H_{xy}(s,t)表示x,y坐标被z坐标改变但保持面积和体积不变。s,t控制着变化的方向和量。

H_{xy}(s,t) = \begin{bmatrix} 1 & 0& 0\\ 0& 1& 0\\ s& t& 0 \end{bmatrix}

H_{xz}(s,t) = \begin{bmatrix} 1 & 0& 0\\ s& 1& t\\ 0& 0& 1 \end{bmatrix}

H_{yz}(s,t) = \begin{bmatrix} 1 & s& t\\ 0& 1& 0\\ 0& 0& 1 \end{bmatrix}

 

 

变换的组合

不同类型的变换顺序:

1. 先缩放,在旋转,最后平移。

使用列矩阵:P_{new} = M_{translation}M_{rotation}M_{scale}P_{old}

使用行矩阵:P_{new} = P_{old}M_{scale}M_{rotation}M_{translation}

 

2. 旋转的变换顺序:

当给定一个旋转角度\left ( \Theta _{x},\Theta _{y},\Theta _{z} \right )时,Unity中世界坐标系的旋转顺序为zxy,个体坐标系的旋转顺序为yxz

参考链接:https://blog.csdn.net/SailingTiger/article/details/78015856

 

 

常见问题

平移变换、正交变换、正交矩阵之间的关系

  • 平移变换属于正交变换的一种,但平移矩阵不是正交矩阵。
  • 正交变换矩阵不一定是正交矩阵,正交变换在任意一组标准正交基下的矩阵才是正交矩阵。

 

为什么先缩放,在旋转,最后平移?

变换一般出现在物体从一个坐标系向另一个坐标系转换的过程,坐标系转换就是变换的目的。比如在个人坐标系向世界坐标系转换的过程,首先要明白缩放、旋转和平移都是针对个体而言,在世界坐标系下进行的。此时物体的个人坐标系和世界坐标系重合:

  1. 如果先旋转后缩放,那么旋转后的个人坐标轴就不再与世界坐标轴重合,那么利用原先定义的缩放方向在此时进行缩放就会出错。比如原先定义的沿x轴缩放2倍,那么此时进行缩放2倍的物体部位就不再是我们想要缩放的物体部位(被旋转走了)了。
  2. 如果先平移,那么接下来的旋转和缩放就不再以原点为中心进行变换了,这不是我们想要的效果,我们想要的是原点进行缩放和旋转。

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值