¿Cómo calculo un centroide 3D?

¿Hay tal cosa como un centroide 3D? Permítame ser perfectamente claro: he estado leyendo y leyendo acerca de los centroides durante los últimos 2 días en este sitio y en toda la web, por lo que estoy perfectamente consciente de las publicaciones existentes sobre el tema, incluida Wikipedia .

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. Luego, quiero colocar un objeto en la posición centroide 3D.

Te diré lo que no quiero:

  • Los vértices promedian, lo que tiraría demasiado lejos en cualquier dirección que tenga una malla más detallada.
  • El centro del cuadro delimitador, porque ya tengo algo trabajando para este escenario.

Estoy abierto a sugerencias sobre el centro de masa, pero no veo cómo funcionaría esto, porque los vértices o los bordes por sí solos no definen ningún tipo de masa, especialmente cuando tengo un bucle de borde seleccionado.

En cuanto a las patadas, les mostraré algunos PyMEL con los que trabajé, usando el código de @Emile 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) 

En teoría, centroid = SUM(pos*volume)/SUM(volume) cuando se divide la parte en volúmenes finitos, cada uno con una ubicación pos y un volumen de valor de volume .

Este es precisamente el cálculo realizado para encontrar el centro de gravedad de una pieza compuesta.

No hay solo un centroide 3D, hay un centroide n-dimensional, y la fórmula para ello se encuentra en la sección “Por fórmula integral” del artículo de Wikipedia que cita.

Tal vez usted está teniendo problemas para configurar esta integral? No has definido tu forma.

[Editar] Voy a reforzar esta respuesta en respuesta a su comentario. Ya que has descrito tu forma en términos de bordes y vértices, asumiré que es un poliedro . Puede dividir un poliedro en pirámides, encontrar los centroides de las pirámides, y luego el centroide de su forma es el centroide de los centroides (este último cálculo se realiza utilizando la fórmula de ja72).

Asumiré que su forma es convexa (sin partes huecas, si este no es el caso, entonces divídala en trozos convexos). Puede dividirlo en pirámides (triangularlo) seleccionando un punto en el interior y dibujando bordes en los vértices. Entonces cada cara de tu forma es la base de una pirámide. Hay fórmulas para el centroide de una pirámide (puede buscar esto, es 1/4 del camino desde el centroide de la cara hasta su punto interior). Entonces, como se dijo, el centroide de su forma es el centroide de los centroides — el cálculo finito de ja72, no una integral, como se indica en la otra respuesta.

Este es el mismo algoritmo que en la respuesta de Hugh Bothwell, sin embargo, creo que 1/4 es correcto en lugar de 1/3. Tal vez usted pueda encontrar algún código para ello en algún lugar usando los términos de búsqueda en esta descripción.

Me gusta la pregunta. El centro de masa suena bien, pero la pregunta entonces es: ¿qué masa para cada vértice?

¿Por qué no usar la longitud promedio de cada borde que incluye el vértice? Esto debería compensar muy bien las áreas con una malla densa.

Tendrá que recrear la información de cara de los vértices (esencialmente una triangulación de Delauney).

Si sus vértices definen un casco convexo, puede elegir cualquier punto arbitrario A dentro del objeto. Trate su objeto como una colección de prismas piramidales que tienen el ápice A y cada cara como base.

Para cada cara, encuentre el área Fa y el centroide 2d Fc; entonces la masa del prisma es proporcional al volumen (== 1/3 base * altura (componente de Fc-A perpendicular a la cara)) y puede ignorar la constante de proporcionalidad siempre que haga lo mismo para todos los prismas; el centro de masa es (2/3 A + 1/3 Fc), o un tercio del camino desde el vértice hasta el centroide 2d de la base.

Luego puede hacer un promedio ponderado en masa de los puntos del centro de masa para encontrar el centroide 3d del objeto en su totalidad.

El mismo proceso debería funcionar para cascos no convexos, o incluso para A fuera del casco, pero el cálculo de la cara puede ser un problema; Tendrá que tener cuidado con la mano de sus caras.