C++ 如何知道物体在3D中只旋转了15度?

C++ 如何知道物体在3D中只旋转了15度?,c++,math,object,3d,rotation,C++,Math,Object,3d,Rotation,我有一个三维空间中的三维对象,在某个方向上定向。我怎么知道它已经从它的初始旋转q(在欧拉角:0,0,0)旋转了15度,在任何轴的任意数量只。例如,在X轴上旋转4*15度,在Y轴上旋转7*15度,在Z轴上旋转13*15度。我怎样才能检测到这个 我尝试从对象的旋转矩阵中获取euler角度,但似乎只有当我只在一个轴上旋转时,它才能正确地检测到情况。如果我开始混合X、Y和Z轴15度旋转,euler角度就会混乱 我100%确定对象只旋转了15度块。我相信旋转矩阵只能分解为四元数,不能分解为每轴旋转。我不确

我有一个三维空间中的三维对象,在某个方向上定向。我怎么知道它已经从它的初始旋转q(在欧拉角:0,0,0)旋转了15度,在任何轴的任意数量只。例如,在X轴上旋转4*15度,在Y轴上旋转7*15度,在Z轴上旋转13*15度。我怎样才能检测到这个

我尝试从对象的旋转矩阵中获取euler角度,但似乎只有当我只在一个轴上旋转时,它才能正确地检测到情况。如果我开始混合X、Y和Z轴15度旋转,euler角度就会混乱


我100%确定对象只旋转了15度块。

我相信旋转矩阵只能分解为四元数,不能分解为每轴旋转。

我不确定您使用的是什么数学库,但如果提供,您可以使用四元数,这将非常直接地实现您想要的功能。之后可以将它们转换为旋转矩阵。

如果可以的话,最简单的方法是存储组件(
float3 m\u平移、m\u旋转、m\u缩放
)和一个矩阵,该矩阵在它们更改时更新(
float4x4 m\u矩阵
)。要获取数据,只需获取该部分的向量并返回它。内存使用量很小(12-16次浮动),计算开销最小(当零件更新时重新计算矩阵)

然而,如果不能做到这一点,建议您可以通过一些工作来分解旋转矩阵。这确实需要大量的数学知识


如该页所述,D3DX库还具有分解矩阵的功能:.

旋转是不可交换的,因此,如果您不知道正确的顺序,则使用Euler角度描述它们是有问题的。如果您知道顺序,可以建立一个方程系统,其中一侧的三个旋转矩阵(由旋转角度参数化)与另一侧的最终旋转矩阵相乘。给你三个方程式和三个未知数。但要注意欧拉角表示法中的奇点

我很确定任何旋转矩阵都任意接近于沿坐标轴旋转15°的乘积。你能提供一些关于这个问题的背景资料,以便我们能引导你走上一条不同的道路吗?不,不是。360可以除以15。@iosiki:没关系。如果你旋转15°X,然后旋转15°Y,然后旋转15°Z,你会得到一个既不围绕X,也不围绕Y,也不围绕Z的旋转。我们把这个旋转称为XYZ。现在我声明,如果进行任何旋转,有一个“单词”(例如xxyzyzyxyz)任意接近它。事实上,我很确定我的说法是正确的,这类似于产生巴纳赫-塔斯基悖论的论点。正如你所说的,在2D中这是错误的。@ioski:如果你能找到两个词(比如A=XYZ和B=XZY,这两个词可能会起作用)来表示绕两个独立轴的无理角度的两个旋转,那么我的说法是正确的(例如,请看),我们通过做24*X(24*15=360)来开始旋转,通过做24*Y和24*Z,我们不应该以任意顺序做24*X+24*Y+24*Z来开始旋转吗?现在,我想检测这个公式是否可以形成任意旋转。你指向的链接不会分解旋转矩阵。它将任意矩阵分解为旋转矩阵乘以其他矩阵。好的,你改变了链接。然而,它将只捕捉旋转已按特定顺序组合的情况。它将捕获例如XYYZ,但不是XZYY。我没有更改链接,我只是删除了(有点误导性的)维基百科链接,并使有用的链接更明显(它已经存在)。我的旋转也存储为四元数。我该怎么做呢?事实上,如果你知道顺序,@peachykeen的回答会给你一个实现的链接。