Как мне вычислить трехмерный центроид?

Существует ли вообще такая вещь, как трехмерный центроид? Позвольте мне быть предельно ясным - я читал и читал о центроидах в течение последних 2 дней как на этом сайте, так и в Интернете, поэтому я прекрасно осведомлен о существующих сообщениях по этой теме, включая Википедию .

Тем не менее, позвольте мне объяснить, что я пытаюсь сделать. По сути, я хочу взять набор ребер и / или вершин, но НЕ граней. Затем я хочу поместить объект в положение трехмерного центроида.

Я скажу вам, чего я не хочу:

  • Среднее значение вершин, которое будет тянуться слишком далеко в любом направлении, имеющем более высокий - детализированная сетка.
  • Центр ограничивающей рамки, потому что у меня уже есть что-то работающее для этого сценария.

Я открыт для предложений относительно центра масс, но я не понимаю, как это будет работать, потому что вершины или ребра сами по себе не определяют какой-либо вид массы, особенно когда у меня просто выбран краевой цикл.

Для удовольствия я покажу вам несколько PyMEL , которые я обработал, используя код @ Emile в качестве ссылки, но я не Думаю, он работает так, как должен:

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
задан Community 23 May 2017 в 12:17
поделиться