8

甚至有 3D 质心这样的东西吗?让我非常清楚 - 在过去的两天里,我一直在这个网站和整个网络上阅读和阅读关于质心的内容,所以我完全了解该主题的现有帖子,包括Wikipedia

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

我会告诉你我不想要的:

  • 顶点平均,这会在任何具有更详细网格的方向上拉得太远。
  • 边界框中心,因为我已经有一些适用于这种情况的东西。

我对关于质心的建议持开放态度,但我不明白这是如何工作的,因为单独的顶点或边并不能定义任何类型的质量,尤其是当我只选择了一个边循环时。

为了好玩,我将向您展示一些我使用@Emile的代码作为参考编写的 PyMEL,但我认为它的工作方式不应该:

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

4 回答 4

8

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

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

于 2011-01-28T02:47:17.007 回答
3

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

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

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

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

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

于 2011-01-28T02:27:27.850 回答
2

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

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

于 2011-01-28T02:10:18.483 回答
1

您将不得不从顶点重新创建人脸信息(本质上是 Delauney 三角剖分)。

如果您的顶点定义了一个凸包,您可以选择对象内的任意点 A。将您的对象视为具有顶点 A 和每个面作为基础的棱锥体的集合。

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

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

相同的过程应该适用于非凸面船体 - 甚至适用于船体外的 A - 但面计算可能是一个问题;你需要小心你的脸的惯用手。

于 2011-01-28T03:17:26.790 回答