[入门] Unity Shader前置知识(4) —— 矩阵变换

上一篇 Unity Shader前置知识(3) —— 特殊矩阵

在Unity或其它三维软件中,一个物体常常能被旋转、缩放和平移,然而这些操作,就是通过矩阵变换来解决的。

1. 线性变换

线性变换(linear transfom)是指那些可以保留向量加和标量乘的变换。用数学公式表示就是:

f(x)+f(y)=f(x+y)

kf(x)=f(kx) 

 线性变换包括对三维物体的缩放(scale)、旋转(rotation)等,如果要对三维矢量进行变换,那么仅仅使用 3 × 3 的矩阵就可以表示所有的线性变换。

2. 仿射变换

仿射变换(affine transform)就是合并线性变换和平移变换的变换类型。由于我们不能使用一个 3 × 3 的矩阵来表示平移变换,所以我们就将其扩展到了 4 × 4 的矩阵(多一个维度来实现对平移的表示),称为齐次矩阵:

\begin{bmatrix} M_{3\times 3} &T_{3\times 1} \\ 0_{1\times 3} &1 \end{bmatrix}

3. 平移矩阵

我们可使用矩阵乘法来表示对一个三维空间的点进行平移变换:

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

 在上面的式子中,t_{x}t_{y}t_{z}分别表示x、y、z坐标的偏移量,从结果很容易看出这个矩阵有平移的效果。例如,假设有点(1,2,3),我们将其平移(2,3,4),则计算式子如下:

\begin{bmatrix} 1 &0 &0 &2 \\ 0 &1 &0 &3 \\ 0 & 0 &1 &4 \\ 0 &0 & 0 &1 \end{bmatrix}\times\begin{bmatrix} 1\\ 2\\ 3\\ 1 \end{bmatrix}=\begin{bmatrix} 3\\ 5\\ 7\\ 1 \end{bmatrix}

 可见最后计算出的平移结果为(3,5,7)。

4. 缩放矩阵

我们同样可以使用矩阵乘法来表示一个缩放变换:

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

 在上面的式子中,k_{x}k_{y}k_{z}分别表示x、y、z坐标的缩放倍数。如果缩放系数 k_{x}=k_{y}=k_{z} ,我们把这样的缩放称为统一缩放(uniform scale),否则称为非统一缩放(nonuniform scale)。

5. 旋转矩阵

我们知道,旋转操作需要指定一个旋转轴,如果我们需要把点绕着x轴旋转θ度,可以使用下面的矩阵:

R_{x}(\theta )=\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轴旋转:

R_{y}(\theta)=\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轴旋转:

R_{z}(\theta)=\begin{bmatrix}\cos\theta &-\sin\theta &0 &0 \\ \sin\theta &\cos\theta &0 &0 \\ 0 &0 &1 &0 \\ 0 &0 &0 &1 \end{bmatrix} 

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值