Für die Verwendung in einer Starrkörpersimulation möchte ich den Massen- und Trägheitstensor (Trägheitsmoment) berechnen, wobei ein Dreiecksgitter die Grenze des (nicht notwendigerweise konvexen) Objekts darstellt und eine konstante Dichte im Inneren annimmt.Wie kann ich die Masse und das Trägheitsmoment eines Polyeders berechnen?
Antwort
Angenommen, Ihr Trimesh ist geschlossen (ob konvex oder nicht) gibt es einen Weg!
Wie Dmckee hervorhebt, baut die allgemeine Methode Tetraeder aus jedem Oberflächendreieck auf und wendet dann die naheliegende Mathe an, um die Masse- und Momentbeiträge von jedem tet zu addieren. Der Trick kommt, wenn die Oberfläche des Körpers Konkavitäten hat, die innere Taschen bilden, wenn man von was auch immer dein Bezugspunkt ist, aus betrachtet.
Also, um zu beginnen, wählen Sie einen Bezugspunkt (der Ursprung in Modellkoordinaten funktioniert gut), es muss nicht einmal innerhalb des Körpers sein. Verbinden Sie für jedes Dreieck die drei Punkte dieses Dreiecks mit dem Bezugspunkt, um ein Tetraeder zu bilden. Hier ist der Trick: Verwenden Sie die Flächennormale des Dreiecks, um herauszufinden, ob das Dreieck auf den Bezugspunkt zu oder von ihm weg zeigt (was Sie anhand des Vorzeichens des Skalarprodukts der Normalen und eines Vektors mit dem Mittelpunkt centroid finden des Dreiecks). Wenn das Dreieck vom Bezugspunkt weg zeigt, behandeln Sie seine Masse und sein Moment normal, aber wenn es zum Bezugspunkt zeigt (was darauf hindeutet, dass zwischen dem Bezugspunkt und dem Körper ein freier Raum ist), negieren Sie Ihre Ergebnisse für dieses tet .
Effektiv was dies tut, ist Chunks des Volumens überzählen und dann korrigieren, sobald diese Bereiche nicht Teil des festen Körpers sind. Wenn ein Körper viele Blubbery-Flansche und groteske Falten hat (habe ich dieses Bild?), Kann ein bestimmtes Stück Volumen um einen hohen Faktor überzählt werden, aber es wird nur so oft abgezogen, dass es aus dem Gitter ausscheidet geschlossen. Auf diese Weise können Sie sogar mit internen Raumblasen in Ihren Objekten umgehen (vorausgesetzt, die Normalen sind korrekt gesetzt). Darüber hinaus kann jedes Dreieck unabhängig gehandhabt werden, sodass Sie es nach Belieben parallelisieren können. Genießen!
Nachträglich: Sie fragen sich vielleicht, was passiert, wenn dieses Skalarprodukt Ihnen einen Wert nahe oder gleich Null gibt. Dies geschieht nur, wenn die Dreiecksfläche parallel ist (ihre Normale ist senkrecht), die Richtung zum Bezugspunkt - was nur für entartete Tets mit kleiner oder Nullfläche sowieso passiert. Das heißt, die Entscheidung, den Beitrag eines tet zu addieren oder zu subtrahieren, ist nur dann fraglich, wenn das tet nichts mehr beitragen würde.
Ich würde einen Blick auf vtkMassProperties. werfen Dies ist ein ziemlich robuster Algorithmus zur Berechnung dieser, eine Oberfläche gegeben, die ein Volumen einschließt.
Zerlegen Sie Ihr Objekt in einen Satz von tetrahedrons um den ausgewählten inneren Punkt. (Das sind Feststoffe, die jedes dreieckige Flächenelement und das gewählte Zentrum verwenden.)
Sie sollten in der Lage sein, die Lautstärke jedes Elements nachzuschlagen. Die moment of inertia sollte auch verfügbar sein.
Es wird etwas schwieriger, wenn die Oberfläche nicht konvex ist.
Ich scheine miss-Erinnerung zu haben, indem Nomenklatur und Skew ist nicht das Adjektiv ich wollte. Ich meine nicht regelmäßig.
Wenn das Objekt nicht konvex ist (und manchmal sogar wenn es ist), ist die Tesselation in Tets viel komplizierter als nur die Masse direkt zu berechnen. –
@Reed Copsey: Ich nehme dein Wort dafür. Die Lösung, die ich angeboten habe, ist sicherlich naiv. – dmckee
Wenn Ihr Polydedron kompliziert ist, sollten Sie die Monte-Carlo-Integration in Erwägung ziehen, die oft für mehrdimensionale Integrale verwendet wird.Sie benötigen einen einschließenden Hyperwürfel und Sie müssen in der Lage sein zu testen, ob sich ein bestimmter Punkt innerhalb oder außerhalb des Polyeders befindet. Und Sie müssen Geduld haben, da die Monte-Carlo-Integration langsam ist.
Starten Sie wie gewohnt bei Wikipedia, und folgen Sie dann den Seiten mit den externen Links zum weiteren Lesen. Haben
(Für Integration diejenigen, die nicht mit Monte Carlo, hier ist, wie eine Masse zu berechnen. Im enthält hypercube Wählen Sie einen Punkt. point_total
entgegen dem hinzufügen. Ist es im Polyeder? Wenn ja, zum point_internal
Zähler hinzuzufügen. diese Lose (siehe die Konvergenz und Fehlerschätzungen gebunden ist.) Dann
mass_polyhedron/mass_hypercube \approx points_internal/points_total
.
Für ein Trägheitsmoment, Sie jede Zählung auf die Referenzachse durch das Quadrat der Entfernung des Punktes gewichten.
Der schwierige Teil besteht darin zu testen, ob ein Punkt drin ist oder außerhalb deines Polyeders. Ich bin mir sicher, dass es Algorithmen für die Berechnung der Geometrie gibt.
Dies wird in dem Buch "Game Physics, Second Edition" von D. Eberly behandelt. Der chapter 2.5.5 und Beispielcode ist online verfügbar. (Einfach gefunden, habe es noch nicht ausprobiert.)
Beachten Sie auch, dass das Polyeder nicht konvex sein muss, damit die Formeln funktionieren, es muss nur simple sein.
Schön. Ich hätte das sehen sollen. Es handelt sich um eine Erweiterung des alten Ansatzes "Zähle die Übergänge", wenn ein Punkt innerhalb oder außerhalb einer Form ist. – dmckee