如何表示一个物体的世界变换矩阵

136 阅读2分钟

物体的世界变换矩阵为

M=TRS M = T·R·S

正文

物体的世界变换矩阵由以下几个部分组成

  • 位置(Translation):物体在世界坐标系中的位置
  • 旋转(Rotation):物体相对于世界坐标系的旋转
  • 缩放(Scaling):物体各轴的缩放因子

1.定义位置,旋转,缩放的矩阵

  • 位置(Translation)T=txtytzTT = \begin{vmatrix}t_x& t_y& t_z \end{vmatrix}^T,转换到齐次坐标系中则表示为T=100tx010ty001tz0001T = \begin{vmatrix} 1& 0& 0& tx \\ 0& 1& 0& ty \\ 0& 0& 1& tz \\ 0& 0& 0& 1 \end{vmatrix}
  • 旋转(Rotation):使用旋转矩阵R表示,通常由欧拉角,四元数或其他表示转换法得到
    • 欧拉角
      • 绕x轴旋转
        Rx(α)=10000cosαsinα00sinαcosα00001 R_x(\alpha)= \begin{vmatrix} 1 &0 &0 &0 \\ 0 &cos\alpha &-sin\alpha &0 \\ 0 &sin\alpha &cos\alpha &0 \\ 0 &0 &0 &1 \end{vmatrix}
      • 绕y轴旋转
        Ry(β)=cosβ0sinβ00100sinβ0cosβ00001R_y(\beta)= \begin{vmatrix} cos\beta &0 &sin\beta &0 \\ 0 &1 &0 &0 \\ -sin\beta &0 &cos\beta &0 \\ 0 &0 &0 &1 \end{vmatrix}
      • 绕z轴旋转
        Rz(γ)=cosγsinγ00sinγcosγ0000100001R_z(\gamma)= \begin{vmatrix} cos\gamma &-sin\gamma &0 &0\\ sin\gamma &cos\gamma &0 &0\\ 0 &0 &1 &0\\ 0 &0 &0 &1 \end{vmatrix}
      假设我们有绕X,Y,Z轴旋转角度分别为α,β,γ\alpha, \beta, \gamma, 则旋转矩阵可以表示为这三个基本旋转矩阵的乘积:
      R=Ry(β)Rx(α)Rz(γ) R = R_{y}(\beta)·R_{x}(\alpha)·R_{z}(\gamma)
      注意:欧拉角表示旋转时需要明确旋转的顺序,不同的顺序会产生不同的结果,在unity中表示旋转矩阵时需要按照ZXY的旋转顺序来运算才能得到正确的结果
    • 四元数
      • 绕x轴旋转α\alpha
      qx=cosα2+sinα2i q_x = cos \frac{\alpha}{2} + sin \frac{\alpha}{2} i
      • 绕y轴旋转α\alpha
      qy=cosα2+sinα2j q_y = cos \frac{\alpha}{2} + sin \frac{\alpha}{2} j
      • 绕z轴旋转α\alpha
      qz=cosα2+sinα2k q_z = cos \frac{\alpha}{2} + sin \frac{\alpha}{2} k
      四元数转换为矩阵
      R=12(y2+z2)2(xyyz)2(xz+wy)02(xy+wz)12(x2+z2)2(yzwx)02(xzwy)2(yz+wx)12(x2+y2)00001 R = \begin{vmatrix} 1-2(y^2 + z^2) &2(xy - yz) &2(xz + wy) &0\\ 2(xy + wz) &1-2(x^2 + z^2) &2(yz - wx) &0\\ 2(xz - wy) &2(yz + wx) &1 - 2(x^2 + y^2) &0\\ 0 &0 &0 &1 \end{vmatrix}
  • 缩放(Scaling)sxsyszT\begin{vmatrix}s_x& s_y& s_z \end{vmatrix}^T,转换到齐次坐标系中则表示为T=sx0000sy0000sz00001T = \begin{vmatrix} s_x& 0& 0& 0 \\ 0& s_y& 0& 0 \\ 0& 0& s_z& 0 \\ 0& 0& 0& 1 \end{vmatrix}

2.计算变换矩阵

变换矩阵M是位置,旋转和缩放的组合,且位置矩阵,旋转矩阵,缩放矩阵有明确的运算顺序:Scaling -> Rotation -> Translation:

M=TRSI M = T·R·S·I

II为单位矩阵,引入它来更好的表示运算的顺序

  • 先进行缩放:
SI=sx0000sy0000sz000011000010000100001=sx0000sy0000sz00001 \begin{align} S·I &= \begin{vmatrix} s_x &0 &0 &0 \\ 0 &s_y &0 &0 \\ 0 &0& s_z& 0 \\ 0 &0 &0 &1 \end{vmatrix} · \begin{vmatrix} 1 &0 &0 &0 \\ 0 &1 &0 &0 \\ 0 &0 &1 &0 \\ 0 &0 &0 &1 \end{vmatrix} \\ &= \begin{vmatrix} s_x &0 &0 &0 \\ 0 &s_y &0 &0 \\ 0 &0 &s_z &0 \\ 0 &0 &0 &1 \end{vmatrix} \end{align}
  • 再进行旋转:
R(SI)=cosθsinθ00sinθcosθ0000100001sx0000sy0000sz00001=sxcosθsysinθ00sxsinθsycosθ0000sz00001\begin{align} R·(S·I) &= \begin{vmatrix} cos\theta &-sin\theta &0 &0 \\ sin\theta &cos\theta &0 &0 \\ 0 &0 &1 &0 \\ 0 &0 &0 &1 \end{vmatrix} · \begin{vmatrix} s_x &0 &0 &0 \\ 0 &s_y &0 &0 \\ 0 &0& s_z& 0 \\ 0 &0 &0 &1 \end{vmatrix}\\ &= \begin{vmatrix} s_x cos\theta &-s_y sin\theta &0 &0\\ s_x sin\theta &s_y cos\theta &0 &0\\ 0 &0 &s_z &0\\ 0 &0 &0 &1 \end{vmatrix} \end{align}

这里旋转矩阵采用绕z轴的旋转矩阵,如果x,y,z轴均有旋转,需要组合起来进行运算

  • 最后进行平移:
T(R(SI))=100tx010ty001tz0001sxcosθsysinθ00sxsinθsycosθ0000sz00001=sxcosθsysinθ0txsxsinθsycosθ0ty00sztz0001\begin{align} T·(R·(S·I)) &= \begin{vmatrix} 1& 0& 0& tx \\ 0& 1& 0& ty \\ 0& 0& 1& tz \\ 0& 0& 0& 1 \end{vmatrix} · \begin{vmatrix} s_x cos\theta &-s_y sin\theta &0 &0\\ s_x sin\theta &s_y cos\theta &0 &0\\ 0 &0 &s_z &0\\ 0 &0 &0 &1 \end{vmatrix} \\ &= \begin{vmatrix} s_x cos\theta &-s_y sin\theta &0 &t_x \\ s_x sin\theta &s_y cos\theta &0 &t_y \\ 0 &0 &s_z &t_z \\ 0 &0 &0 &1 \end{vmatrix} \end{align}

总结

  • unity使用列主序矩阵,采用右乘法
  • 矩阵M表达的信息为
    • 自身x轴方向(sxcosθ,sxsinθ,0)(s_x cos\theta, s_x sin\theta, 0)
    • 自身y轴方向(sysinθ,sycosθ,0)(-s_y sin\theta, s_y cos\theta, 0)
    • 自身z轴方向为(0,0,sz)(0, 0, s_z)