Question

Y at-il même chose un comme un barycentre 3D? Permettez-moi d'être parfaitement clair-je ai été en train de lire et de lire sur centroïdes pour les 2 derniers jours à la fois sur ce site et sur le Web, donc je suis parfaitement conscient aux postes existants sur le sujet, y compris Wikipedia

Cela dit, permettez-moi d'expliquer ce que je suis en train de faire. Au fond, je veux prendre une sélection d'arêtes et / ou des sommets, mais les visages ne. Je veux ensuite placer un objet à la position barycentre 3D.

Je vais vous dire ce que je ne veux pas:

  • Les sommets, ce qui ferait tirer trop loin dans une direction qui a un maillage plus haut détaillé.
  • Le centre de la boîte englobante, parce que je l'ai déjà quelque chose à travailler pour ce scénario.

Je suis ouvert aux suggestions sur le centre de masse, mais je ne vois pas comment cela fonctionnerait, parce que les sommets ou les arêtes seuls ne définissent pas une sorte de masse, surtout quand j'ai juste une boucle de bord sélectionné.

Pour les coups de pied, je vais vous montrer quelques PyMEL que je travaillais en utilisant @ code Emile comme référence, mais je ne pense pas il fonctionne comme il se doit:

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)
Était-ce utile?

La solution

En théorie centroid = SUM(pos*volume)/SUM(volume) lorsque vous diviser la partie en volumes finis chacun avec un emplacement pos et la valeur du volume volume.

Ceci est précisément le calcul fait pour trouver le centre de gravité d'une pièce composite.

Autres conseils

Il n'y a pas seulement une 3D barycentre, il y a un centre de gravité de dimension n, et la formule pour elle est donnée dans la section « Par formule intégrale » de l'article de Wikipedia que vous citez.

Peut-être que vous avez des difficultés pour établir cette intégrale? Vous n'avez pas défini votre forme.

[Modifier] Je vais Musclez cette réponse en réponse à votre commentaire. Puisque vous avez décrit votre forme en termes d'arêtes et de sommets, alors je suppose qu'il est un polyèdre . Vous pouvez partitionner un polyèdre en pyramides, trouver les centroïdes des pyramides, puis le centre de gravité de votre forme est le barycentre des centres de gravité (ce dernier calcul est effectué en utilisant la formule de ja72).

Je suppose que votre forme est convexe (pas de parties creuses --- si ce n'est pas le cas, alors le casser en morceaux convexes). Vous pouvez partitionner en pyramides (trianguler il) en choisissant un point dans l'intérieur des bords et le dessin aux sommets. Ensuite, chaque face de votre forme est la base d'une pyramide. Il existe des formules pour le barycentre d'une pyramide (vous pouvez regarder ça, il est 1/4 le chemin du centre de gravité du visage à votre point intérieur). Ensuite, comme cela a été dit, le centre de gravité de votre forme est le barycentre des centres de gravité --- calcul fini de ja72, et non une intégrale --- comme indiqué dans l'autre réponse.

Ceci est le même algorithme que dans la réponse de Hugh Bothwell, mais je crois que 1/4 est correct au lieu de 1/3. Peut-être que vous pouvez trouver un code pour elle qui se cache quelque part autour de l'utilisation des termes de recherche dans cette description.

J'aime la question. Centre de masse sonne juste, mais la question devient alors, quelle masse pour chaque sommet?

Pourquoi ne pas utiliser la durée moyenne de chaque bord qui comprend le sommet? Cela devrait compenser bien des zones avec un maillage dense.

Vous devrez recréer des informations face aux sommets (essentiellement une triangulation Delaunay).

Si vos sommets définissent une coque convexe, vous pouvez choisir un point quelconque A l'intérieur de l'objet. Traiter votre objet comme une collection de prismes pyramidaux ayant un sommet et chaque face en tant que base.

Pour chaque face, trouver la zone Fa et le 2 barycentre Fc; puis la masse de prisme est proportionnel au volume (== 1/3 socle * hauteur (composant de Fc-A perpendiculaire à la face)) et on peut ne pas tenir compte de la constante de proportionnalité aussi longtemps que vous faire la même pour tous les prismes; le centre de masse est (2/3 A + 1/3 Fc), ou un tiers de la distance du sommet au centre de gravité de la base 2d.

Vous pouvez alors faire une moyenne des points de centre de masse pondérée en masse pour trouver le centre de gravité 3D de l'objet dans son ensemble.

Le même processus devrait travail pour les coques non convexes - ou même pour l'extérieur de la coque - mais le calcul du visage peut être un problème; vous devrez faire attention à la chiralité de vos visages.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top