| Operatoren |
distance_object_model_3d — Bestimmt die Abstände der Punkte eines 3D-Objektmodells zu einem anderen 3D-Objektmodell.
distance_object_model_3d( : : ObjectModel3DFrom, ObjectModel3DTo, Pose, MaxDistance, GenParamNames, GenParamValues : )
Der Operator distance_object_model_3d bestimmt die Abstände der Punkte im 3D-Objektmodell ObjectModel3DFrom zu den Punkten, Dreiecken oder dem Primitiv im 3D-Objektmodell ObjectModel3DTo. Die Abstände werden im 3D-Objektmodell ObjectModel3DFrom als erweitertes Attribut mit dem Namen '&distance' gespeichert. Die Abstände können danach mittels get_object_model_3d_params abgerufen werden oder mittels select_points_object_model_3d oder anderen Operatoren, die erweiterte Attribute verwenden, weiterverarbeitet werden.
Die Zieldaten (Punkte, Dreiecke oder Primitiv) werden anhand der in ObjectModel3DTo vorhandenen Daten ausgewählt. Dabei werden die ersten vorhandenen Daten in der folgenden Reihenfolge verwendet: Primitiv, Dreiecke, Punkte. Alternativ zu dieser automatischen Auswahl können die Zieldaten auch manuell mit dem generischen Parameter 'distance_to' gesetzt werden (s.u.). Allgemeine Polygone werden als Zieldaten nicht unterstützt und müssen vor dem Aufruf dieses Operators mittels des Operators triangulate_object_model_3d in Dreiecke umgewandelt werden.
Optional kann ein Schwellwert in MaxDistance gesetzt werden. Abstände, die diesen Schwellwert überschreiten, werden auf diesen Schwellwert gesetzt. Das Setzen eines Schwellwerts kann die Ausführung des Operators signifikant beschleunigen. Ist MaxDistance gleich 0, so wird kein Schwellwert verwendet.
Ist Pose ein nicht-leeres Tupel, so gibt es eine Pose an, welche vor der Distanzbestimmung auf die Punkte von ObjectModel3DFrom angewandt wird. Die Pose kann über den generischen Parameter 'invert_pose' invertiert werden (s.u.).
Je nach Zieldatentyp (Punkte, Dreiecke oder Primitiv) gibt es verschiedene Methoden zur Abstandsbestimmung. Einige dieser Methoden bauen eine Datenstruktur über den Elementen von ObjectModel3DTo auf, welche die Berechnung beschleunigt. Der Aufbau dieser Datenstruktur für das 3D-Objektmodell ObjectModel3DTo kann auch durch den Operator prepare_object_model_3d durchgeführt werden. Dies hat den Vorteil, dass der Aufbau auch bei mehreren Aufrufen von distance_object_model_3d mit demselben Ziel-Objektmodell nur einmal durchgeführt werden muss, beispielsweise bei einem Suchmodell.
Wenn der Abstand zu Punkten oder zu Dreiecken berechnet wird kann der Operator optional den Index des jeweils nächsten Punktes oder Dreiecks für jeden Punkt aus ObjectModel3DFrom zurückgeben. Dazu muss der generische Parameter 'store_closest_index' auf 'true' gesetzt werden (siehe unten). Der Index wird als erweitertes Attribut mit dem Namen '&closest_index' im 3D-Objektmodell ObjectModel3DFrom gespeichert. Der Index kann nicht berechnet werden, wenn die 'voxel'-Methode verwendet wird. Wenn der Abstand eines Punktes zu seinem nächsten Punkt oder Dreieck die in MaxDistance definierte maximale Distanz überschreitet, so wird der Index seines nächsten Elements auf -1 gesetzt.
Optional können auch vorzeichenbehaftete Abstände zu Punkten, Dreiecken oder einem Primitiv berechnet werden. Dazu muss der generische Parameter 'signed_distances' auf 'true' gesetzt werden. Vorzeichenbehaftete Abstände können nicht berechnet werden, wenn bei Abständen von Punkten zu Punkten die 'voxel'-Methode verwendet wird.
Im Folgenden werden die verschiedenen Zieldatentypen und Methoden erklärt, sowie ihre Vor- und Nachteile beschrieben. Der Operator distance_object_model_3d bestimmt, abhängig von den Zieldaten, automatisch eine Methode. Alternativ kann die Methode manuell über den generischen Parameter 'mode' gesetzt werden.
Für die Bestimmung der Punkt-zu-Punkt-Abstände werden die folgenden Methoden unterstützt:
Für jeden Punkt aus ObjectModel3DFrom werden die Abstände zu allen Punkten in ObjectModel3DTo berechnet, und der kleinste Abstand verwendet. Diese Methode benötigt keine vorberechnete Datenstruktur, und ist für wenige Punkte in ObjectModel3DTo die schnellste.
Die Punkte in ObjectModel3DTo werden in einem KD-Baum organisiert, welcher die Suche nach dem nächsten Punkt beschleunigt. Der Aufbau des Baums ist sehr effizient. Die Suchzeit ist dabei in etwa logarithmisch zu der Anzahl der Punkten in ObjectModel3DTo. Die Suchzeit ist allerdings nicht konstant und kann stark von der Lage der Suchpunkte in ObjectModel3DFrom abhängen.
Die Punkte in ObjectModel3DTo werden in einer Voxelstruktur gespeichert. Diese Voxelstruktur erlaubt eine Suche in annähernd konstanter Zeit, d.h. unabhängig von der Lage des Suchpunktes und der Größe der Zielpunktwolke. Der Aufbau der Voxelstruktur dauert allerdings deutlich länger als der Aufbau eines KD-Baums. Diese Datenstruktur eignet sich besonders für eine Vorberechnung mittels prepare_object_model_3d.
Für die Bestimmung des kleinsten Punkt-zu-Dreieck-Abstands werden die folgenden Methoden unterstützt:
Für jeden Punkt aus ObjectModel3DFrom werden die Abstände zu allen Dreiecken in ObjectModel3DTo berechnet und der kleinste Abstand verwendet. Diese Methode benötigt keine vorberechnete Datenstruktur, und ist für wenige Dreiecke in ObjectModel3DTo die schnellste.
Die in ObjectModel3DTo gespeicherten Dreiecke werden in einem KD-Baum gespeichert, wodurch die Suche nach dem nächsten Dreieck beschleunigt wird. Der Aufbau des Baums ist vergleichsweise effizient. Die Suchzeit ist in etwa logarithmisch zu der Anzahl der Dreiecke in ObjectModel3DTo. Die Suchzeit ist allerdings nicht konstant und kann von der Lage der Suchpunkte in ObjectModel3DFrom abhängen.
Die Dreiecke in ObjectModel3DTo werden in einer Voxelstruktur gespeichert. Diese Voxelstruktur erlaubt eine Suche in annähernd konstanter Zeit, d.h. unabhängig von der Lage des Suchpunktes und der Anzahl der Dreiecke in der Zielstruktur. Der Aufbau der Voxelstruktur dauert allerdings deutlich länger als der Aufbau eines KD-Baums. Diese Datenstruktur eignet sich besonders für eine Vorberechnung mittels prepare_object_model_3d. Für den Aufbau der Voxelstruktur werden die Dreiecke abgetastet. Die entsprechende Abtastdistanz kann mit den generischen Parameter 'sampling_dist_rel' und 'sampling_dist_abs' gesetzt werden. Standardmäßig wird 'sampling_dist_rel' auf 0.03 gesetzt. Eine genaue Beschreibung der beiden Parameter findet sich unten. Bei der Verwendung der Voxelstruktur für die Bestimmung der Abstände zu Dreiecken können die berechneten Distanzen in einigen Fällen um ca. 10% der Abtastdistanz von den tatsächlichen Abständen nach oben abweichen.
Da ObjectModel3DTo nur ein Primitiv enthalten kann, werden die Punkt-zu-Primitiv-Abstände immer linear durchgeführt. Der Aufbau oder die Verwendung einer Datenstruktur ist weder nötig noch möglich.
Das Berechnen von Abständen zu primitiven Ebenen, die mittels segment_object_model_3d oder fit_primitives_object_model_3d erzeugt wurden, kann vergleichsweise langsam sein, da diese Ebenen eine komplexe Ausdehnung beinhalten. Wenn nur der Abstand zu der Ebene relevant ist und die Ausdehnung ignoriert werden soll, wird empfohlen, die Pose der Ebene mittels get_object_model_3d_params mit dem Parameter 'primitive_parameter_pose' abzurufen und mittels gen_plane_object_model_3d eine neue Ebene ohne Ausdehnung zu erzeugen.
Die folgende Tabelle gibt eine Übersicht über die verschiedenen Zieldaten, Methoden, sowie deren Vor- und Nachteile.
Zieldaten Methode Aufbau- Ungefähre Eigenschaften
Zeit Suchzeit
----------------------------------------------------------------------------
Punkte linear 0 N - Keine Vorberechnung
- Schnellste Methode für kleine N
- Standardmethode für N<100
Punkte kd-tree N log(N) log(N) - Schnelle Vorberechnung
- Nicht-konstante Suchzeit
- Standardmethode für N>=100
Punkte voxel N log(N) konstant - Langsame Vorberechnung
- Sehr schnelle Suche
- Standardmethode für Vorberechnung mit
distance_object_model_3d
Dreiecke linear 0 N - Keine Vorberechnung
- Schnellste Methode für kleine N
- Standardmethode
Dreiecke kd-tree N log(N) log(N) - Schnelle Vorberechnung
- Nicht-konstante Suchzeit
Dreiecke voxel N log(N) log(log(N)) - Langsame Vorberechnung
- Benötigt Abtastdistanz
- Sehr schnelle Suche
- Kleine Fehler möglich
- Standardmethode für Vorberechnung mit
distance_object_model_3d
Primitiv linear 0 konstant
Zusätzlich zu den oben beschriebenen Parametern können die folgenden Parameter verwendet werden, um den Operator zu beeinflussen. Diese Parameter und ihre Werte können in den Parametern GenParamNames und GenParamValues gesetzt werden. Alle der folgenden Parameter sind optional.
Mit diesem Parameter können die Zieldaten explizit ausgewählt werden.
(Standardwert) Die Zieldaten werden automatisch ausgewählt. Dazu wird überprüft, welches der folgenden Attribute in ObjectModel3DTo vorhanden ist, und das erste vorhandene verwendet: Primitiv, Dreiecke, Punkte.
Es werden die Abstände zu dem in ObjectModel3DTo vorhandenen Primitiv berechnet.
Es werden die Abstände zu den in ObjectModel3DTo vorhandenen Dreiecken berechnet.
Es werden die Abstände zu den in ObjectModel3DTo vorhandenen Punkten berechnet.
Mit diesem Parameter kann die zu verwendende Methode explizit gesetzt werden. Nicht alle Methoden sind für alle Zieldaten möglich. Die möglichen Kombinationen sind in obiger Tabelle aufgelistet.
(Standardwert) Es wird die Standardmethode für die ausgewählten Zieldaten verwendet.
Die Abstände werden über eine lineare Suche berechnet.
Die Abstände werden über einen KD-Baum berechnet.
Die Abstände werden über eine Voxelstruktur berechnet.
Mit diesem Parameter kann die in Pose übergebene Pose invertiert werden.
(Standardwert) Die Pose wird nicht invertiert.
Die Pose wird invertiert.
Mit diesem Parameter kann der Name des erweiterten Attributs gesetzt werden, in welchem die berechneten Abstände gespeichert werden. Standardmäßig werden die Abstände in dem erweiterten Attribut mit dem Namen '&distance' im Objektmodell ObjectModel3DFrom gespeichert. Wird das gleiche Objektmodell für mehrere Aufrufe von distance_object_model_3d verwendet, so wird das Attribut überschrieben. Um dies zu vermeiden, kann der Name des Attributs verändert werden. Gültige Namen von erweiterten Attribute fangen mit einem '&' an.
Diese Parameter werden verwendet, wenn die Abstände zu Dreiecken mit der Voxel-basierten Methode berechnet werden. Für den Aufbau der Voxelstruktur werden die Dreiecke regelmäßig abgetastet. Die Abtastdistanz kann entweder absolut mit dem Parameter 'sampling_dist_abs' gesetzt werden, oder relativ zum Durchmesser des achsenparallelen umschließenden Quaders mit 'sampling_dist_rel'. Nur einer der beiden Parameter kann gesetzt werden. Der Durchmesser des achsenparallelen umschließenden Quaders kann mit get_object_model_3d_params abgerufen werden. Die Erstellung der Voxelstruktur für Dreiecke kann sehr lange dauern und wird i.d.R. mittels prepare_object_model_3d vorberechnet (siehe oben).
Dieser Parameter aktiviert die Berechnung des Index des nächsten Punktes oder Dreiecks für jeden Punkt in ObjectModel3DFrom (siehe oben). Die Indizes werden im erweiterten Attribut '&closest_index' zurückgegeben.
(Standardwert) Der Index wird nicht zurückgegeben.
Der Index wird zurückgegeben.
Dieser Parameter wird verwendet, um vorzeichenbehaftete Abstände zwischen den Punkten im 3D-Objektmodell ObjectModel3DFrom zu den Punkten, Dreiecken oder dem Primitiv im 3D-Objektmodell ObjectModel3DTo zu berechnen.
(Standardwert) Es werden Abstände ohne Vorzeichen zurückgegeben.
Es werden vorzeichenbehaftete Abstände zurückgegeben.
Abhängig von den vorhandenen Zieldaten (Punkte, Dreiecke oder Primitive) sind die folgenden Besonderheiten zu beachten:
Eine Berechnung von vorzeichenbehafteten Abständen zu Punkten wird nur für die Methoden 'kd-tree'' und 'linear' unterstützt. Unabhängig davon welche der beiden Methoden für die Bestimmung des kleinsten Punkt-zu-Punkt-Abstands verwendet wird, ist eine Berechnung der vorzeichenbehafteten Distanz nur möglich, wenn Punktnormalen für die Punkte im 3D-Objektmodell ObjectModel3DTo vorhanden sind oder mit dem Operator set_object_model_3d_attrib_mod gesetzt wurden.
Vorzeichenbehaftete Distanzen können für alle oben aufgeführten Methoden berechnet werden. Bei vorzeichenbehafteten Abständen von Punkten zu Dreiecken wird die Distanz negativ gesetzt, wenn das Skalarprodukt mit dem Normalenvektor des Dreiecks kleiner Null ist.
Berechnet man den Abstand zu zylinderförmigen, kugelförmigen oder quaderförmigen Primitiven, so erhalten Punkte des 3D-Objektmodells ObjectModel3DFrom einen negativen Abstand, wenn sie sich innerhalb des Primitivs befinden und einen positiven, wenn sie außerhalb davon liegen. Werden Abstände von Punkten zu Ebenen berechnet, so erhalten Punkte einen negativen Abstand, wenn sie unterhalb der Ebene liegen und einen positiven wenn sie oberhalb davon liegen.
Handle des 3D-Objektmodells mit den Quelldaten.
Handle des 3D-Objektmodells mit den Zieldaten.
Namen der generischen Parameter.
Defaultwert: []
Werteliste: 'distance_to', 'invert_pose', 'method', 'output_attribute', 'sampling_dist_abs', 'sampling_dist_rel', 'signed_distances', 'store_closest_index'
Werte der generischen Parameter.
Defaultwert: []
Werteliste: 'auto', 'false', 'kd-tree', 'linear', 'points', 'primitive', 'triangles', 'true', 'voxel'
distance_object_model_3d liefert den Wert 2 (H_MSG_TRUE) wenn alle Parameter korrekt sind. Wenn notwendig wird eine Ausnahmebehaldung durchgeführt.
prepare_object_model_3d, read_object_model_3d, find_surface_model, xyz_to_object_model_3d
get_object_model_3d_params, render_object_model_3d, disp_object_model_3d, clear_object_model_3d
3D Metrology
| Operatoren |