unity 欧拉角旋转 问题的常见解法(图)问题分析(组图)

unity 欧拉角旋转 问题的常见解法(图)问题分析(组图)

回答第二个问题:给定两点 AB,求从 A 到 B 的欧拉变换。

首先,这种描述是不合理的。它应该是 a 和 b 向量,描述两个方向。然后假设它在右手坐标系中,这样方便描述。

首先找到aXb,也就是同时垂直于a和b的向量,这显然是旋转轴。然后找到a•b=cos θ,这显然描述了旋转的角度。这将问题变成“围绕任何轴旋转一个角度”。

解决这个问题的常见方法是先变换成以旋转轴为坐标轴的坐标系,然后绕旋转轴旋转,最后变换回原来的坐标系。

这里涉及到三个问题:一是以旋转轴为坐标轴如何得到一个坐标系,二是如何变换到这个坐标系游戏动态,又如何变换回来,三是如何绕着坐标旋转。坐标轴。问题3这里就不展开了,因为如果你知道欧拉角是什么,你就必须知道如何绕坐标轴旋转。

一、找一个以旋转轴为坐标轴的坐标系

常说坐标轴的本质是一组正交基,也就是说,只要三个向量相互正交(垂直),那么这三个向量就构成了一组坐标轴(注:其实不是正交基坐标轴,但是那样的话不方便绕坐标轴随便旋转)。所以问题变成了“如何找到两个相互垂直且都垂直于旋转轴的向量”。并且注意,如果已经有两个向量,那么可以直接交叉相乘得到第三个向量。因此,问题进一步简化为“如何方便快捷地找到垂直于当前向量的向量”。这个问题研究了很多

设旋转轴为u=(x,y,z),目标向量v=(x',y',z'),因为u和v互相垂直,所以u·v=xx'+yy '+zz' =0 。请注意,x、y、z 都是已知量,因此这是一个具有三个未知数的方程。当然,它没有唯一的解决方案,但没关系,我们的目标只是找到一个可行的解决方案。

总而言之,对于任何 u,我们都可以找到垂直于它的 av。然后求两者的叉积得到一个正交基,然后我们就得想办法变换到这个正交基上。

二、将a和b向量转换为以旋转轴为坐标轴的坐标系

首先有个理解,我们平时描述向量的时候,其实是有一个标准正交基的,比如vector(3,2,1),其实就是简写unity 欧拉角旋转,应该写成(3, 2,1)=3i+2j+1k,其中i,j,k是我们平时使用的正交基,是三个相互正交的向量。要将(3,2,1)转化为问题在一个新的标准正交基下u,v,w其实就是求解这个方程3i+2j+1k=xu+yv+zw。我们把它变成矩阵乘法的形式:(i,j,k)\left ( \begin {matrix}3\\2\\1\end{matrix}\right) =(u,v,w)\left(\begin{matrix}x\\y\\z\end{matrix}\right) ,请注意,(i,j,k) 实际上是一个 3x3 矩阵游戏动态,而不是行向量。

因为 u, v, w 是相互正交的向量,如果我们再有一个条件,假设 u, v, w 都是单位向量(这很容易做到,只需将其归一化即可),那么 (u, v, w ) 是一个正交矩阵。正交矩阵的特点是它是可逆的,它的转置是它的逆。

所以上式可以转化为: (u,v,w)^T(i,j,k)\left( \begin{matrix}3\\2\\1\end{matrix}\right) =\ left( \begin{matrix}x\\y\\z\end{matrix}\right)unity 欧拉角旋转,因此得到 x, y, z。

我们通常使用的i,j,k是(1,0,0),(0,1,0),(0,0,1)),所以上式为:\左 ( \begin{matrix}u^T\\v^T\\w^T\end{matrix}\right)\left( \begin{matrix}3\\2\\1\end{matrix}\right ) =\left(\begin{matrix}x\\y\\z\end{matrix}\right) 。

将前面提到的要变换的a和b替换为(3, 2, 1),然后将前面得到的一组正交基带以旋转轴为坐标轴输入(u, v ,w),得到获得的 (x, y, z) 是变换后的坐标。

结语

变换后做一个旋转,再做一个逆变换(即乘以(u,v,w)再变换回原来的(i,j,k)坐标系),就可以得到结果. 设旋转前的向量为a,旋转后的向量为b,坐标系变换的矩阵为M=(u,v,w),旋转变换的矩阵为R,则b=MRM^{T }一个 。

最后,关于这个问题,其实用四元数来解题更方便。四元数描述旋转是直接用一个旋转轴+旋转角度来描述的,所以自然更适合“绕轴旋转一定角度”这个问题。这里就不展开了。