Frage

Gibt es überhaupt so etwas wie einen 3D -Zentroid? Lassen Sie mich vollkommen klar sein - ich habe in den letzten 2 Tagen sowohl auf dieser Website als auch im Internet über Zentroids gelesen und über die vorhandenen Beiträge zu diesem Thema, einschließlich des gesamten Webs, gelesen, also bin ich mir vollkommen bewusst Wikipedia.

Lassen Sie mich erklären, was ich versuche zu tun. Grundsätzlich möchte ich eine Auswahl an Kanten und/oder Scheitelpunkten treffen, aber keine Gesichter. Dann möchte ich ein Objekt an der 3D -Zentroidposition platzieren.

Ich werde dir sagen, was ich nicht will:

  • Die Eckpunkte durchschnittlich, die zu weit in jede Richtung ziehen würden, die ein hochdetailteres Netz aufweist.
  • Das Begrenzungskastenzentrum, weil ich bereits etwas für dieses Szenario habe.

Ich bin offen für Vorschläge zum Massenzentrum, aber ich sehe nicht, wie dies funktionieren würde, da Scheitelpunkte oder Kanten allein keine Masse definieren, insbesondere wenn ich nur eine Kantenschleife ausgewählt habe.

Für Kicks werde ich Ihnen einige zeigen PyMel dass ich mich aufgetragen habe und benutze @Emiles Code als Referenz, aber ich glaube nicht, dass es so funktioniert, wie es sollte:

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)
War es hilfreich?

Lösung

In der Theorie centroid = SUM(pos*volume)/SUM(volume) Wenn Sie das Teil in endliche Volumes mit jeweils einer Position aufteilen pos und Volumenwert volume.

Dies ist genau die Berechnung, die für den Schwerpunkt eines zusammengesetzten Teils durchgeführt wurde.

Andere Tipps

Es gibt nicht nur einen 3D-Zentroid, es gibt ein n-dimensionales Schwerpunkt, und die Formel dafür ist in der Abschnitt "By Integral Formel" des von Ihnen zitierenden Wikipedia-Artikels angegeben.

Vielleicht haben Sie Probleme, dieses Integral einzurichten? Sie haben Ihre Form nicht definiert.

Bearbeiten] Ich werde diese Antwort als Antwort auf Ihren Kommentar verbessern. Da Sie Ihre Form in Bezug auf Kanten und Eckpunkte beschrieben haben, dann gehe ich davon aus, dass es ein ist Polyeder. Sie können ein Polyedron in Pyramiden aufteilt, die Schwerpunkte der Pyramiden finden, und dann ist der Schwerpunkt Ihrer Form der Schwerpunkt der Schwerpunkte (diese letzte Berechnung erfolgt mit der Formel von JA72).

Ich gehe davon aus, dass Ihre Form konvex ist (keine hohlen Teile-Wenn dies nicht der Fall ist, zerbrechen Sie sie in konvexe Stücke). Sie können es in Pyramiden aufteilt (triangulieren Sie es), indem Sie einen Punkt im Innenraum auswählen und Kanten an den Eckpunkten zeichnen. Dann ist jedes Gesicht Ihrer Form die Basis einer Pyramide. Es gibt Formeln für den Schwerpunkt einer Pyramide (Sie können dies nachschlagen, es ist 1/4 der Weg vom Schwerpunkt des Gesichts bis zu Ihrem Innenraum). Wie bereits gesagt, ist der Schwerpunkt Ihrer Form der Schwerpunkt der Schwerpunkte-die endliche Berechnung von Ja72, nicht ein integrales-wie in der anderen Antwort angegeben.

Dies ist der gleiche Algorithmus wie in Hugh Bothwells Antwort, aber ich glaube, dass 1/4 anstelle von 1/3 korrekt ist. Vielleicht finden Sie einen Code dafür, dass er in dieser Beschreibung irgendwo herum lauert.

Ich mag die Frage. Massenzentrum klingt richtig, aber die Frage wird dann, welche Masse für jeden Scheitelpunkt?

Warum nicht die durchschnittliche Länge jeder Kante verwenden, die den Scheitelpunkt enthält? Dies sollte schöne Bereiche mit einem dichten Netz ausgleichen.

Sie müssen Gesichtsinformationen von den Scheitelpunkten (im Wesentlichen eine Delauney -Triangulation) neu erstellen.

Wenn Ihre Eckpunkte einen konvexen Rumpf definieren, können Sie einen beliebigen Punkt A innerhalb des Objekts auswählen. Behandeln Sie Ihr Objekt als Sammlung von Pyramidenprismen mit Apex A und jedem Gesicht als Basis.

Finden Sie für jedes Gesicht den Bereich FA und den 2D -Zentroid -FC; Dann ist die Masse des Prismas proportional zum Volumen (== 1/3 Basis * Höhe (Komponente von FC-A senkrecht zum Gesicht)) und Sie können die Konstante der Verhältnismäßigkeit ignorieren, solange Sie für alle Prismen dasselbe tun. Der Massenzentrum beträgt (2/3 a + 1/3 fc) oder ein Drittel des Weges vom Scheitelpunkt bis zum 2D -Zentroid der Basis.

Sie können dann einen massengewichtigen Durchschnitt der Massenpunkte durchführen, um das 3D-Zentroid des Objekts als Ganzes zu finden.

Der gleiche Prozess sollte Arbeiten Sie für nicht konvexe Rümpfe - oder sogar für einen außerhalb des Rumpfes -, aber die Gesichtskalkulation kann ein Problem sein; Sie müssen vorsichtig mit der Händigkeit Ihrer Gesichter sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top