惯性张量的计算


10

我承认,这是一个复杂而冗长的问题,我还不太了解,所以我将尽力解释。

简短版:是否有通用的c ++ / physx公式可根据对象形状计算惯性张量?

长版: 对于我们的物理学,我们需要指定x,y和z惯性张量。当前,我们的方法几乎只是基于质量的比率。因此,如果一个对象在X轴上较长,而在Y和Z上较薄,并且质量为10000,则将Z和Y设置为7000,将X设置为3000。(这不确切,只是给出一个想法)

这比较好用,但是我们最大的问题是当某处存在关节不稳定性时,我们必须不断猜测张量,直到找出最合适的。如果我们进行非常大的物理模拟,而20个以上的关节中有一个关节使所有其他关节失去稳定性,则这将变得非常耗时。

我正在研究的是一个函数,它将采用对象的边界框并希望计算出相对准确的张量。我已经从http://en.wikipedia.org/wiki/List_of_moment_of_inertia_tensors进行了一些数学运算,并制作了一个函数,该函数基本上可以像下面的类似旋转一样工作。

宽度w,高度h,深度d和质量m的长方体 在此处输入图片说明

或者,如果旋转结束,则如下所示:

在此处输入图片说明 在此处输入图片说明

因此,这似乎给了我类似于我们一直使用的方式的结果,但是我不想切换到这种方式而不确保它能正常使用。以下是基于具有立方体和中心枢轴的第一个图像的我的函数的代码。

NxVec3 CalculateInertiaTensor( VisBoundingBox_cl boundingBox, float m )
{
    float width = boundingBox.GetSizeX();
    float height = boundingBox.GetSizeZ();
    float depth = boundingBox.GetSizeY();

    float xTensor = 0.083f * m*(height*height + depth*depth);
    float yTensor = 0.083f * m*(width*width + depth*depth);
    float zTensor = 0.083f * m*(width*width + height*height);

    return NxVec3(xTensor, yTensor, zTensor);
}

我不能保证这是正确的方法(因为最准确的方法是使用实​​际形状而不是边界框),而且我对惯性张量和数学不是很熟悉,但似乎返回数字与我们所使用的非常相似。这里有人碰巧知道是否有更好的方法吗?


3
如果可以将对象分解为四面体,则应该能够使用张量的线性以及基本公式来计算四面体的惯性矩(例如,您可以在Wolfram Alpha中找到它)来计算精确值。张量。我对包围盒方法的担心是,它实际上取决于对象填充了BB的数量。想象一下,例如,一个胖的椭圆形和一个细长的螺旋弹簧之间的区别。
史蒂文·斯塔德尼基

感谢您的输入。没错,我的主要问题是出现“ A”形物体时,BB将使张量不正确地返回。我会检查您的信息,谢谢!
Mungoid '04年

不用客气-如果您希望我详细介绍一下,我应该能够从中得出正确的答案,但这足以让您入门。
史蒂文·斯塔德尼基

如果您愿意,那太棒了!我已经尝试了好一阵子了,但是我在这个领域还处于起步阶段,所以我最终变得越来越困惑=-)
Mungoid 2012年

Answers:


7

我要指出这是一个难题,因为基于使用格林定理将体积积分转换为表面积分的常规公式不适用,因此您实际上必须对图形进行四面体分解,但是实际上那是不正确的。只要您的形状具有均匀的密度(无论如何,这大概已经是您可能已经做出的近似值,并且对于大多数情况来说是一个完全合理的形状),则可以将体积积分简化为表面积分,然后将其进一步简化。更好的是,似乎有一个非常漂亮的算法,并且网上有代码可以做到这一点。看看http://www.cs.berkeley.edu/~jfc/mirtich/massProps.html,Brian Mirtich的页面描述了他的计算力矩和质心的算法。它应该可以满足您在这方面的几乎所有需求。请注意,这是您一次想做的事情,既可以作为形状导出的工具,也可以作为导入时的工具,而不是每帧都需要做的事情。只需将围绕质量中心的惯性张量与其余形状信息一起存储,并且如果您需要找到围绕其他轴的惯性矩的张量,则可以使用标准定理来推导它。

希望这可以满足您的需求-如果还有更多我想帮助的地方,请告诉我!


4

我自己从未做过此事,但是如果我必须为任意网格编写一个快速解决方案,我可能会在对象内部生成足够的质量点以对其进行近似并从中计算出惯性张量。

可以在形状的边界框内均匀生成点,然后丢弃实际形状之外的点。这样可以减少仅检查点是否在形状内的问题。


0

对于大多数游戏应用程序(即“炸东西”),仅使用上面给出的矩形实体的等式可能就足够了。假设对象是轴向对齐的,而不是跨边界框的对角线,则该对象应该起作用。一些游戏物理引擎(例如ODE)仅使用惯性张量的主对角线上的项。对于它们,您的对象至少需要大致轴向对齐才能正常工作。

我在1997年的《坠落物体》中使用了Mirtich的算法。它运作良好,但是您必须具有干净的几何体-拓扑正确的封闭非自相交网格。如果有孔,惯性计算将产生完全虚假的结果。我仅使用凸几何,所以我首先运行QHull以获得用于碰撞目的的凸壳,然后从中计算出惯性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.