2011-01-28 209 views
6

还有像3D质心这样的东西吗?让我清楚一点 - 我一直在阅读和阅读本网站和网络上过去两天的质心,因此我完全了解该主题的现有帖子,包括Wikipedia如何计算3D质心?

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

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

  • 顶点平均水平,这将拉动太远具有更多的优质详尽网的任何方向。
  • 边界框中心,因为我已经有这方面的工作。

我很乐意接受有关质心的建议,但我不明白这是如何工作的,因为顶点或边缘本身并没有定义任何形式的质量,尤其是当我只有一个边缘循环选择。

踢,我会告诉你一些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) 

回答

8

理论上centroid = SUM(pos*volume)/SUM(volume)将零件分成有限体积,每个体积都有pos和体积值volume

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

2

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

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

+0

你知道,在你发布这个消息之前,我只是想着同样的事情。我想知道结果会是什么。因为在这种情况下数学会非常简单,因为它只是一个加权平均值。我现在需要睡觉,但明天我会看看。 – jedmao 2011-01-28 11:10:55

+0

仍在研究此解决方案。我会尽力让你更新。 – jedmao 2011-02-02 07:52:44

+0

我很乐意看到结果。它明显适用于一些简单的测试用例。例如。一个顶点很多,而另一个顶点较少的圆柱体。如果它不起作用,什么样的测试案例是一个问题? – Keith 2011-02-03 02:51:14

3

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

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

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

我会假设你的形状是凸的(没有空心部分---如果不是这种情况,那么把它分成凸块)。您可以通过在内部选取一个点并将边缘绘制到顶点来将其分割为金字塔(将其三角化)。然后你的形状的每个面都是金字塔的基础。有一个金字塔质心的公式(你可以查看它,它是从脸的质心到内部点的四分之一)。那么正如所说的那样,你的形状的质心是质心的质心--- ja72的有限计算,而不是另一个答案中给出的积分---。

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

+0

是啊,好吧...尴尬,我甚至不知道什么是整数。当我没有看到实际的代码时,我迷路了。我不明白公式。你说得对。当我只有一组顶点时,我的形状不一定定义。你怎么知道如何正确连接点? – jedmao 2011-01-28 11:12:41

1

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

如果你的顶点定义了一个凸包,你可以在物体内部选取任意一个点A.把你的物体当作一组顶点A和每个面作为底座的金字塔棱镜。

对于每个人脸,找到区域Fa和2d质心Fc;那么棱镜的质量与体积(== 1/3基础*高度(垂直于面部的Fc-A的分量))成正比,并且只要您对所有棱镜都做同样的事情,您就可以不考虑比例常数;质量中心是(2/3 A + 1/3 Fc),或者是从基座的顶点到2d质心的三分之一。

然后,您可以对质心点进行质量加权平均,以查找整个对象的三维质心。

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