任意物体的旋转矩阵
若我们知道世界空间上一个物体的三个轴方向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} ①
Mr−1⋅u=⎣⎡100⎦⎤①
M
r
−
1
⋅
v
=
[
0
1
0
]
②
M_{r}^\mathrm{ -1 }·v= \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} ②
Mr−1⋅v=⎣⎡010⎦⎤②
M
r
−
1
⋅
n
=
[
0
0
1
]
③
M_{r}^\mathrm{ -1 }·n= \begin{bmatrix} 0 \\ 0 \\ 1 \end{bmatrix} ③
Mr−1⋅n=⎣⎡001⎦⎤③
假设
M
r
−
1
M_{r}^\mathrm{ -1 }
Mr−1
的表达式为
[
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⎦⎤=>⎣⎡∣mx∣∣my∣∣mz∣⎦⎤
根据②③知道向量|mx|
∣
m
x
∣
⋅
v
=
0
∣
m
x
∣
⋅
n
=
0
|mx|·v = 0\\ |mx|·n = 0
∣mx∣⋅v=0∣mx∣⋅n=0
说明|mx|垂直于向量v,n所构成的平面,所以|mx|只有两种可能,要不就平行与u,要不就平行与-u。
又因为①式,知道
∣
m
x
∣
⋅
u
=
1
|mx|·u = 1
∣mx∣⋅u=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}
Mr−1=⎣⎡uxvxnxuyvynyuzvznz⎦⎤
因为
M
r
−
1
M_{r}^\mathrm{ -1 }
Mr−1
是正交矩阵所以有
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=(Mr−1)T=⎣⎡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;
}
}
结果 红色的旋转和白色立方体一致
(注:仅仅个人笔记和心得,记录下加深印象,若有错误的地方恳请各路大佬指正)