如何计算3D质心?

时间:2011-01-28 02:06:45

标签: python average maya

甚至还有像3D质心这样的东西?让我非常清楚 - 我已经在本网站和网络上阅读和阅读过去2天的质心,所以我完全了解该主题的现有帖子,包括Wikipedia

那就是说,让我解释一下我要做的事情。基本上,我想选择边和/或顶点,但不是面。然后,我想将一个对象放在3D质心位置。

我会告诉你我不想要的东西:

  • 顶点平均,在任何具有更高细节网格的方向上拉得太远。
  • 边界框中心,因为我已经有了适合这种情况的工作。

我愿意接受有关质心的建议,但我不知道这是如何工作的,因为顶点或边缘本身并没有定义任何质量,特别是当我选择了一个边缘循环时。 / p>

对于踢腿,我会向您展示一些我使用PyMEL作为参考的@Emile's code,但我不认为它的工作方式应该如此:

from pymel.core import ls, spaceLocator
from pymel.core.datatypes import Vector
from pymel.core.nodetypes import NurbsCurve

def get_centroid(node):
    if not isinstance(node, NurbsCurve):
        raise TypeError("Requires NurbsCurve.")
    centroid = Vector(0, 0, 0)
    signed_area = 0.0
    cvs = node.getCVs(space='world')
    v0 = cvs[len(cvs) - 1]
    for i, cv in enumerate(cvs[:-1]):
        v1 = cv
        a = v0.x * v1.y - v1.x * v0.y
        signed_area += a
        centroid += sum([v0, v1]) * a
        v0 = v1
    signed_area *= 0.5
    centroid /= 6 * signed_area
    return centroid

texas = ls(selection=True)[0]
centroid = get_centroid(texas)
print(centroid)
spaceLocator(position=centroid)

4 个答案:

答案 0 :(得分:8)

理论上centroid = SUM(pos*volume)/SUM(volume)当您将零件拆分为有限卷时,每个卷都有一个位置pos和卷值volume

这正是为找到复合材料零件的重心所做的计算。

答案 1 :(得分:3)

不仅有一个3D质心,还有一个n维质心,它的公式在你引用的维基百科文章的“按积分公式”部分给出。

也许你在设置这个积分时遇到了麻烦?你还没有定义你的形状。

[编辑]我会在回答你的评论时加强这个答案。由于您已根据边和顶点描述了形状,因此我假设它是polyhedron。您可以将多边形分区为金字塔,找到金字塔的质心,然后形状的质心是质心的质心(最后一次计算是使用ja72的公式完成的。)

我假设你的形状是凸的(没有空心部分---如果不是这种情况则将它分成凸块)。您可以通过在内部选取一个点并将边缘绘制到顶点来将其分割为金字塔(三角剖分)。然后你的形状的每个面都是金字塔的底部。有金字塔质心的公式(你可以看一下,它是从脸的质心到你的内部点的1/4)。然后如前所述,你的形状的质心是质心的质心 - ja72的有限计算,而不是其他答案中给出的积分---

这与Hugh Bothwell的答案算法相同,但我相信1/4是正确的而不是1/3。也许你可以使用本说明书中的搜索词找到一些潜伏在某处的代码。

答案 2 :(得分:2)

我喜欢这个问题。质量中心听起来不错,但问题就变成了,每个顶点的质量是多少?

为什么不使用包含顶点的每条边的平均长度?这应该可以很好地补偿具有密集网格的区域。

答案 3 :(得分:1)

您必须从顶点重新创建面部信息(基本上是Delauney三角剖分)。

如果顶点定义凸包,则可以在对象内选择任意点A.将您的物体视为具有顶点A和每个面作为基础的金字塔形棱镜的集合。

对于每个面部,找到面积Fa和2d质心Fc;然后棱镜的质量与体积成正比(== 1/3基础*高度(垂直于面部的Fc-A的成分)),只要对所有棱镜做同样的事情,就可以忽略比例常数;质心为(2/3 A + 1/3 Fc),或从基部的顶点到2d质心的三分之一。

然后,您可以对质心点进行质量加权平均,以找到整个物体的3d质心。

同样的过程适用于非凸壳 - 甚至是船体外的A - 但是面部计算可能是一个问题;你需要小心脸上的用法。