我在 3D 空间中有两个相同类型的对象(使用 OpenGL 渲染它们)。这些对象存储 xyz 偏移量和表示标准 4x4 旋转矩阵的旋转矩阵。
一个精简的例子:
class object {
float rotMatrix[16];
float xyzTrans[3];
//a displaylist for drawing the object
}
我将 GLUI 用于 UI 控件,这使得以格式存储转换非常简单。
问题: 我需要为一个对象相对于另一个对象定义一个“正确”的方向。例如,如果第一个对象直接面向 z 轴下方,而第二个对象相同但也围绕 x 轴旋转了大约 45 度,这将被视为“正确”并且我的函数执行它们需要执行的操作.这当然可以变化,也许它是相同的 z 但在 x 和 y 上旋转,或者甚至可能围绕每个轴旋转一点。 “正确”旋转的定义将存储在对象中以供比较。
理想情况下我希望做这样的事情:
bool checkRotation(object* first, object* second) {
//do some comparison stuff
if (eachCheck < someTolerance)
return true;
return false;
}
这可以通过比较两个旋转矩阵来实现吗?我需要转换为四元数并使用它们吗?
This question是我发现的最接近我要问的问题,但它的不同足以令人困惑。
最佳答案
不是一个完整的答案,但对于评论来说太长了:
如果您有两个诚实的旋转矩阵,那么它们应该是可逆的,并且行列式为 1。调用矩阵 A
和 B
。如果你想检查 A(X)
和 B(X)
同一对象 X
在这两个旋转下是“接近”的意思是你可以通过绕指定轴旋转从 A(X)
到 B(X)
,这等同于检查通过 A
乘以 B
的倒数得到的矩阵是否“几乎”绕该轴旋转。所以这可能是您想要查看的内容。
我不太熟悉 OpenGL 矩阵数学函数,所以无法提供任何代码,抱歉。
关于c++ - 如何比较物体之间的相对旋转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20914052/