如何比较物体之间的相对旋转?
Posted
技术标签:
【中文标题】如何比较物体之间的相对旋转?【英文标题】:How to compare relative rotation between objects? 【发布时间】:2014-01-03 22:41:52 【问题描述】:我在 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】:不是一个完整的答案,但评论太长了:
如果您有两个诚实的旋转矩阵,那么它们应该是可逆的,并且具有行列式 1。将矩阵称为 A
和 B
。如果您想检查两个旋转下同一对象 X
的图像A(X)
和B(X)
是否“接近”,即您可以从A(X)
转到@ 987654327@ 通过围绕指定轴旋转,这相当于检查通过将A
乘以B
的倒数得到的矩阵是否“几乎”围绕该轴旋转。所以这可能是你想看的那种东西。
我对 OpenGL 矩阵数学函数不太熟悉,所以无法提供任何代码,抱歉。
【讨论】:
这很有用,可能是一个好的开始——尝试看看我能用你提供的信息做什么。最大的问题是我关心两个项目之间的旋转——也就是说,如果它们的最终方向符合定义。通过找到到它们的原点的距离来很容易地处理位置,也许这些矩阵有某种类似的想法?你能找到两个矩阵之间的相对“距离/差异”,这样可以确保一个非常正确的结果吗?以上是关于如何比较物体之间的相对旋转?的主要内容,如果未能解决你的问题,请参考以下文章