2020-12-18

   日期:2020-12-21     浏览:146    评论:0    
核心提示:任意物体的旋转矩阵若我们知道世界空间上一个物体的三个本地坐标轴u v n。要如何求得它的旋转矩阵。假设它的旋转矩阵为Mr M_{r}Mr​那么则有Mr⋅[111] M_{r} · \left[ \begin{matrix} 1 \\ 1 \\ 1 \\ \end{matrix} \right]Mr​⋅⎣⎡​111​⎦⎤​...

任意物体的旋转矩阵

若我们知道世界空间上一个物体的三个轴方向u v n(都是单位向量)。要如何求得它的旋转矩阵。

假设它是由rotation = (0, 0, 0)的位置乘旋转矩阵
M r M_{r} Mr

后所得的位置。 那么则有
M r − 1 ⋅ u = [ 1 0 0 ] ① M_{r}^\mathrm{ -1 }·u= \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} ① Mr1u=100
M r − 1 ⋅ v = [ 0 1 0 ] ② M_{r}^\mathrm{ -1 }·v= \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} ② Mr1v=010
M r − 1 ⋅ n = [ 0 0 1 ] ③ M_{r}^\mathrm{ -1 }·n= \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} ③ Mr1n=001
假设
M r − 1 M_{r}^\mathrm{ -1 } Mr1
的表达式为
[ m 11 m 12 m 13 m 21 m 22 m 23 m 31 m 32 m 33 ] = > [ ∣ m x ∣ ∣ m y ∣ ∣ m z ∣ ] \begin{bmatrix} m11 & m12 & m13 \\ m21 & m22 & m23 \\ m31 & m32 & m33 \\ \end{bmatrix} => \begin{bmatrix} |mx| \\ |my| \\ |mz| \\ \end{bmatrix} m11m21m31m12m22m32m13m23m33=>mxmymz

根据②③知道向量|mx|
∣ m x ∣ ⋅ v = 0 ∣ m x ∣ ⋅ n = 0 |mx|·v = 0\\ |mx|·n = 0 mxv=0mxn=0
说明|mx|垂直于向量v,n所构成的平面,所以|mx|只有两种可能,要不就平行与u,要不就平行与-u。
又因为①式,知道
∣ m x ∣ ⋅ u = 1 |mx|·u = 1 mxu=1
所以|mx| = u

同理有|my| = v |mz| = n
所以(假若u的表达式为(ux,uy,uz)v(vx,vy,vz)n(nx,ny,nz))
M r − 1 = [ u x u y u z v x v y v z n x n y n z ] M_{r}^\mathrm{ -1 } = \begin{bmatrix} ux & uy & uz \\ vx & vy & vz \\ nx & ny & nz \\ \end{bmatrix} Mr1=uxvxnxuyvynyuzvznz

因为 M r − 1 M_{r}^\mathrm{ -1 } Mr1
是正交矩阵所以有 M r = ( M r − 1 ) T = [ u x v x n x u y v y n y u z v z n z ] M_{r} = (M_{r}^\mathrm{ -1 })^\mathrm{ T } = \begin{bmatrix} ux & vx & nx \\ uy & vy & ny \\ uz & vz & nz \\ \end{bmatrix} Mr=Mr1T=uxuyuzvxvyvznxnynz

举例,把白色立方体的当前的旋转矩阵应用到红色立方体

代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjMatrix : MonoBehaviour
{ 

    public GameObject cubeWhite;

    public GameObject cubeRed;
    
    // Start is called before the first frame update
    void Start()
    { 

        Vector3 u = cubeWhite.transform.right;
        Vector3 v = cubeWhite.transform.up;
        Vector3 n = cubeWhite.transform.forward;

        Matrix4x4 Mr = new Matrix4x4(
            new Vector4(u.x, u.y, u.z, 0),
            new Vector4(v.x, v.y, v.z, 0),
            new Vector4(n.x, n.y, n.z, 0),
            new Vector4(0  , 0,   0,   1)
            );

        cubeRed.transform.rotation = Mr.rotation;

    }
}

结果 红色的旋转和白色立方体一致

(注:仅仅个人笔记和心得,记录下加深印象,若有错误的地方恳请各路大佬指正)

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服