Как вычислить 3D-центр?
6 jedmao [2011-01-28 05:06:00]
Есть ли даже такая вещь, как 3D-центр? Позвольте мне быть совершенно ясным: я читал и читал о центроидах последние 2 дня как на этом сайте, так и в Интернете, поэтому я прекрасно разбираюсь в существующих сообщениях по этой теме, включая Wikipedia.
Итак, позвольте мне объяснить, что я пытаюсь сделать. В принципе, я хочу взять ряд ребер и/или вершин, но НЕ лица. Затем я хочу поместить объект в положение 3D-центра тяжести.
Я расскажу вам, чего я не хочу:
- Средние вершины, которые будут слишком далеко перемещаться в любом направлении с более высокой детализацией сетки.
- Центр ограничивающей рамки, потому что у меня уже есть что-то, работающее для этого сценария.
Я открыт для предложений о центре масс, но я не вижу, как это будет работать, потому что вершины или ребра сами по себе не определяют какую-либо массу, особенно когда у меня только выбран край.
Для пинок я покажу вам PyMEL, с которым я работал, используя @Emile 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)
python average maya
4 ответа
8 Решение ja72 [2011-01-28 05:47:00]
В теории centroid = SUM(pos*volume)/SUM(volume), когда вы разбиваете часть на конечные тома, каждая с местоположением pos и значением объема volume.
Это точно расчет, выполненный для нахождения центра тяжести составной части.
3 Glenn [2011-01-28 05:27:00]
Существует не только 3D-центр, существует n-мерный центроид, а формула для него приведена в разделе "По интегральной формуле" статьи Википедии, которую вы цитируете.
Возможно, у вас возникли проблемы с настройкой этого интеграла? Вы не определили свою форму.
[Изменить] Я отвечу на этот ответ в ответ на ваш комментарий. Поскольку вы описали свою форму в терминах ребер и вершин, я предположим, что это polyhedron. Вы можете разбивать полиэдр на пирамиды, находить центроиды пирамид, а затем центроид вашей формы является центроидом центроидов (этот последний расчет выполняется с использованием формулы ja72).
Я предполагаю, что ваша форма выпукла (без полых частей - если это не так, то разбить ее на выпуклые куски). Вы можете разбить его на пирамиды (триангулировать), выбрав точку в интерьере и нарисуйте края до вершин. Тогда каждая грань вашей формы является основой пирамиды. Существуют формулы для центроида пирамиды (вы можете посмотреть это, это на расстоянии 1/4 от центра тяжести лица до вашей внутренней точки). Тогда, как было сказано, центроид вашей фигуры - это центр тяжести центроидов --- конечный расчет ja72, а не интеграл --- как указано в другом ответе.
Это тот же алгоритм, что и у Хью Ботвелла, однако я считаю, что 1/4 верен, а не 1/3. Возможно, вы можете найти какой-то код, который скрывается где-то, используя условия поиска в этом описании.
2 Keith [2011-01-28 05:10:00]
Мне нравится вопрос. Центр масс звучит правильно, но тогда вопрос становится, какая масса для каждой вершины?
Почему бы не использовать среднюю длину каждого ребра, которая включает в себя вершину? Это должно компенсировать приятные области с плотной сеткой.
1 Hugh Bothwell [2011-01-28 06:17:00]
Вам нужно будет воссоздать информацию о лицах из вершин (в основном, триангуляцию Деланея).
Если ваши вершины определяют выпуклую оболочку, вы можете выбрать любую произвольную точку A внутри объекта. Относитесь к своему объекту как к коллекции пирамидальных призм с вершиной А и каждой гранью в качестве основы.
Для каждого лица найдите область Fa и 2d centroid Fc; то масса призмы пропорциональна объему (== 1/3 основания * высота (составляющая Fc-A перпендикулярно грани)), и вы можете игнорировать постоянную пропорциональности, пока вы делаете то же самое для всех призм; центр массы (2/3 A + 1/3 Fc), или третья часть от вершины до 2d центра тяжести основания.
Затем вы можете выполнить взвешенное по массе среднее значение точек центра масс, чтобы найти 3D-центр объекта в целом.
Тот же процесс должен работать для невыпуклых оболочек - или даже для A вне корпуса - но вычисление лица может быть проблемой; вам нужно будет проявлять осторожность в отношении рук ваших лиц.