为了在刚体模拟中使用,我想计算质量和惯性张量(惯性矩),给定一个三角形网格表示(不一定是凸的)对象的边界,并假设内部的密度恒定。
5 回答
假设您的修剪是封闭的(无论是否凸出),有一种方法!
正如 dmckee 指出的那样,一般的方法是从每个表面三角形构建四面体,然后应用显而易见的数学计算每个 tet 的质量和力矩贡献。当从任何参考点观察时,当身体表面有凹面时,技巧就出现了,这些凹面会形成内部口袋。
所以,开始时,选择一些参考点(模型坐标中的原点可以正常工作),它甚至不需要在身体内部。对于每个三角形,将该三角形的三个点连接到参考点以形成一个四面体。诀窍是:使用三角形的表面法线来确定三角形是面向还是背离参考点(您可以通过查看法线的点积的符号和指向三角形)。如果三角形背离参考点,则正常处理其质量和力矩,但如果它面向参考点(表明参考点和实体之间存在开放空间),则否定该 tet 的结果.
实际上,这样做是过度计算体积块,然后在这些区域显示不是实体的一部分时进行纠正。如果一个身体有很多油脂状的凸缘和怪诞的褶皱(有那个图像吗?),一个特定的体积可能会被一个很大的因素高估,但如果你的网格是,它会被减去足够的时间来抵消它关闭。以这种方式工作,您甚至可以处理对象中的内部空间气泡(假设法线设置正确)。最重要的是,每个三角形都可以独立处理,因此您可以随意并行化。享受!
事后思考:您可能想知道当该点积给您的值为零或接近零时会发生什么。这只发生在三角形面平行(其法线垂直)指向参考点的方向时——这只会发生在面积小或为零的退化 tets 上。也就是说,增加或减去 tet 的贡献的决定只有在 tet 无论如何都不打算贡献任何东西时才值得怀疑。
我会看看vtkMassProperties。 给定一个包含一个体积的表面,这是一个相当稳健的计算算法。
如果您的多面体很复杂,请考虑使用蒙特卡罗积分,该积分通常用于多维积分。您将需要一个封闭的超立方体,并且您将需要能够测试给定点是在多面体内部还是外部。您需要耐心等待,因为蒙特卡洛积分很慢。
像往常一样从 Wikipedia 开始,然后按照外部链接页面进行进一步阅读。
(对于那些不熟悉蒙特卡洛积分的人,这里是计算质量的方法。在包含的超立方体中选择一个点。添加到point_total
计数器中。它在多面体中吗?如果是,添加到point_internal
计数器中。做这个很多(见收敛和误差范围估计。)然后
mass_polyhedron/mass_hypercube \approx points_internal/points_total
.
对于惯性矩,您可以通过点到参考轴的距离的平方对每个计数进行加权。
棘手的部分是测试一个点是在多面体内部还是外部。我确信有计算几何算法。