Konkave Geometrien

Wenn 3D-Modelle programmatisch erzeugt werden sollen, wie z.B. die Einlegeböden in einem Schrankkonfigurator, dann geht dasd sehr einfach, solange das Objekt konvex ist. Bei konkaven Objekten wirds kompliziert. Wir erklären den Unterschied und was man machen kann.

Was ist eine konkave Geometrie?

Fangen wir mit dem Gegenteil an. Für eine konvexe Geometrie gilt: Wenn Du Dir zwei beliebige Punkte auf Ihrer Oberfläche aussuchst, dann liegt die gesamte Verbindungslinie im Inneren des Objektes.

Konkave und konvexe Geometrie

Alle anderen Geometrien sind konkav. Schau Dich mal um. Nahezu alle Objekte, die in der realen Welt vorkommen, sind konkav.

Konstruktion einer konvexen Geometrie

In three.js lassen sich konvexe Geometrien ziemlich leicht mit der (ConvexGeometry)[https://threejs.org/docs/#examples/en/geometries/ConvexGeometry] erzeugen:

const points = [
  new THREE.Vector3( 100, 0, 0 ),
  new THREE.Vector3( 0, 100, 0 ),
  new THREE.Vector3( 0, 0, 100 ),
  new THREE.Vector3( 0, 0, 0 )
]
const geometry = new THREE.ConvexGeometry( points )

Man erzeugt also einfach die Eckpunkte und lässt daraus die Geometrie ermitteln. Mit O(n log(n)) ist das auch gar nicht so langsam.

Konstruktion einer konkaven Geometrie

Das hätte man gern auch für allgemeine Geometrien: Einfach eine Punktwolke erzeugen und daraus die Geometrie ermitteln.

Leider ist das nicht ganz so einfach. Das wird auch schnell klar, wenn man sich überlegt, dass es überhaupt nicht eindeutig ist, wie das Objelt zu einer gegebenen Punktwolke aussehen soll:

Alphga Shape

Daher gibt es folgende Möglichkeiten:

Welcher dieser Algorithmen zum Einsatz kommt, hängt natürlich sehr vom Objekt ab, dass modelliert werden soll.