Czy istnieje nawet coś takiego jak centroid 3D? Pozwól, że będę całkowicie czysty - czytałem i czytałem o centroidach przez ostatnie 2 dni zarówno na tej stronie, jak i w Internecie, więc doskonale zdaję sobie sprawę z istniejących postów na ten temat, w tym z Wikipedia.Jak obliczyć centroid 3D?
Powiedziawszy to, pozwól mi wyjaśnić, co próbuję zrobić. Zasadniczo chcę wybrać krawędzie i/lub wierzchołki, ale NIE twarze. Następnie chcę umieścić obiekt w pozycji środka ciężkości 3D.
powiem ci, czego nie chcą:
- Wierzchołki Średnio co ciągnąć zbyt daleko w dowolnym kierunku, który ma bardziej szczegółowe wysokiej siatki.
- Środek obwiedni, ponieważ mam już coś na ten scenariusz.
Jestem otwarty na sugestie dotyczące środka masy, ale nie widzę jak to będzie działać, ponieważ krawędzie lub wierzchołki sam nie określają jakichkolwiek masowych, zwłaszcza gdy mam tylko pętlę krawędzi wybrany.
dla zabawy, to ci pokażę niektóre PyMEL, że pracował w górę, używając @Emile's code jako punkt odniesienia, ale nie sądzę, że to działa tak, jak powinien:
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)
Mam zamiar zaakceptować tę odpowiedź dla uproszczenia, ale nie będę w stanie przetestować jej do końca. Będę was informować. – jedmao