¿Existe incluso algo así como un centroide 3D? Permítanme ser perfectamente claro: he estado leyendo y leyendo acerca de los centroides durante los últimos 2 días tanto en este sitio como en la web, así que estoy perfectamente al tanto de las publicaciones existentes sobre el tema, incluido el Wikipedia.¿Cómo calculo un centroide 3D?
Dicho esto, déjame explicarte lo que estoy tratando de hacer. Básicamente, quiero tomar una selección de bordes y/o vértices, pero NO caras. Entonces, quiero colocar un objeto en la posición del centroide 3D.
te voy a decir lo que no quiero:
- Los vértices promedio, que tire demasiado lejos en cualquier dirección que tiene una malla más alto-detallada.
- El centro del cuadro delimitador, porque ya tengo algo que funciona para este escenario.
Estoy abierto a sugerencias sobre el centro de masa, pero no veo cómo esto funcionaría, porque los vértices o los bordes por sí solos no definen ningún tipo de masa, especialmente cuando solo tengo un bucle de borde seleccionado.
Para patadas, te voy a mostrar algunos PyMEL que trabajé hacia arriba, usando @Emile's code como referencia, pero no creo que esté funcionando como debería:
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)
Voy a aceptar esta respuesta por simplicidad, pero no podré probarla hasta más adelante. Te mantendré informado. – jedmao