Pregunta

¿Hay incluso algo como un centroide 3D? Permítanme ser perfectamente claro: he estado leyendo y leyendo sobre centroides durante los últimos 2 días tanto en este sitio como en la web, por lo que estoy perfectamente consciente en las publicaciones existentes sobre el tema, incluyendo 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 del centroide 3D.

Te diré lo que no quiero:

  • El promedio de los vértices, que llegarían demasiado lejos en cualquier dirección que tenga una malla más detallada.
  • El Centro de caja delimitador, porque ya tengo algo funcionando para este escenario.

Estoy abierto a sugerencias sobre Center of Mass, 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 solo tengo un bucle de borde seleccionado.

Por patadas, te mostraré algunos Pymel que trabajé, usando @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)
¿Fue útil?

Solución

En teoria centroid = SUM(pos*volume)/SUM(volume) Cuando divide la parte en volúmenes finitos cada uno con una ubicación pos y valor de volumen volume.

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

Otros consejos

No solo hay un centroide 3D, hay un centroide n-dimensional, y la fórmula para ella se da en la sección "por fórmula integral" del artículo de Wikipedia que cita.

¿Quizás tienes problemas para configurar esta integral? No has definido tu forma.

Editar] reforzaré esta respuesta en respuesta a su comentario. Como ha descrito su forma en términos de bordes y vértices, entonces asumiré que es un poliedro. Puede dividir un poliedrón 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 usando la fórmula de JA72).

Asumiré que su forma es convexa (no hay partes huecas, si este no es el caso, rompa en trozos convexos). Puede dividirlo en pirámides (triangularla) eligiendo un punto en el interior y dibujando bordes a 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 centroide de la cara hasta su punto interior). Luego, 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 da 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. Quizás pueda encontrar algún código para el acecho en algún lugar utilizando los términos de búsqueda en esta descripción.

Me gusta la pregunta. El centro de masa suena bien, pero la pregunta se convierte en 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 áreas muy bien con una malla densa.

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

Si sus vértices definen un casco convexo, puede elegir cualquier punto arbitrario 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 ápice 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 conjunto.

El mismo proceso debería Trabajar para cascos no convexos, o incluso para un casco fuera del casco, pero la calculación facial puede ser un problema; Deberá tener cuidado con la mano de sus caras.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top