如何计算三维质心?

2024-09-29 21:35:43 发布

您现在位置:Python中文网/ 问答频道 /正文

有三维质心吗?让我非常清楚-过去两天我在这个网站和整个网络上都在阅读和阅读关于质心的文章,所以我非常清楚这个主题的现有文章,包括Wikipedia

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

我告诉你我不想要什么:

  • 顶点是平均的,这会在具有更高细节网格的任何方向上拉得太远。
  • 边界框中心,因为我已经有一些东西在这个场景中工作了。

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

对于kicks,我将向您展示一些我设计的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)

Tags: fromcoreimportnode文章areacvsv1
3条回答

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

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

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

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

[编辑]我会根据你的评论加强这个回答。既然你已经用边和顶点描述了你的形状,那么我假设它是一个polyhedron。你可以把一个聚酯瓶分成金字塔,找到金字塔的质心,然后你的形状的质心就是质心的质心(最后的计算是用ja72的公式完成的)。

我假设你的形状是凸的(没有中空的部分——如果不是这样,那就把它分成凸块)。通过在内部拾取一个点并将边绘制到顶点,可以将其分割为棱锥体(对其进行三角剖分)。然后你的形状的每个面都是金字塔的底部。金字塔的质心有公式(你可以查一下,从面质心到内部点的距离是1/4)。如前所述,形状的质心是质心的质心——ja72的有限计算,而不是积分——如另一个答案所示。

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

理论上讲,当你把零件分成有限体积时,每个体积都有一个位置和体积值。

这正是为找到复合材料零件的重心而进行的计算。

相关问题 更多 >

    热门问题