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, GenParamName, GenParamValue : )
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 intern trianguliert bevor der Abstand zu
den Dreiecken berechnet wird. In diesem Sinne ist ein Operator-Aufruf
mit schon triangulierten Objekten schneller als einer für Objekte mit
allgemeinen Polygonen.
MaxDistance kann benutzt werden, um einen Schwellenwert für die
berechneten Distanzen zu setzen. Wenn MaxDistance auf 0
gesetzt wird, werden alle Distanzen berechnet. Wenn MaxDistance auf
einen anderen Wert gesetzt wird, werden alle Punkte, bei denen die Distanz
MaxDistance überschreiten würde, nicht verarbeitet. Für diese Punkte
wird der Wert von MaxDistance in dem Attribut '&distance'
gespeichert. Das Setzen von MaxDistance kann also die
Geschwindigkeit des Operators deutlich erhöhen, wenn ein Wert ungleich
0 eingestellt wird.
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.
Objekte mit allgemeinen Polygonen können zusätzlich mit dem Operator
prepare_object_model_3d trianguliert werden und die Dreiecke
werden im 3D-Objekt gespeichert, um die Abstandsberechnung weiter zu
beschleunigen. Die Triangulierung wird nur ausgeführt, wenn der
generische Parameter 'distance_to' auf 'triangles'
gesetzt ist. Entgegen der Triangulierung im Operator
triangulate_object_model_3d wird hier das Attribut mit den
Polygonen nicht gelöscht.
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. Es ist möglich, diese Datenstruktur
vorzuberechnen, indem man prepare_object_model_3d mit
Purpose 'distance_computation' auf
ObjectModel3DTo anwendet.
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. Es ist möglich, diese Datenstruktur
vorzuberechnen, indem man prepare_object_model_3d mit
Purpose 'distance_computation' auf
ObjectModel3DTo anwendet.
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-Zeit | Ungefähre Suchzeit | Eigenschaften |
|---|---|---|---|---|
| Punkte | linear | 0 | - Keine Vorberechnung | |
| - Schnellste Methode für kleine | ||||
| - Standardmethode für | ||||
| Punkte | kd-tree | - Schnelle Vorberechnung | ||
| - Suchzeit nicht konstant | ||||
| - Standardmethode für | ||||
| Punkte | voxel | - Langsame Vorberechnung | ||
| - Sehr schnelle Suche | ||||
- Standardmethode für Vorberechnung mit prepare_object_model_3d
|
||||
| Dreiecke | linear | 0 | - Keine Vorberechnung | |
| - Schnellste Methode für kleine | ||||
| - Standardmethode | ||||
| Dreiecke | kd-tree | - Schnelle Vorberechnung | ||
| - Suchzeit nicht konstant | ||||
| Dreiecke | voxel | - Langsame Vorberechnung | ||
| - Benötigt Abtastdistanz | ||||
| - Sehr schnelle Suche | ||||
| - Kleine Fehler möglich | ||||
- Standardmethode für Vorberechnung mit prepare_object_model_3d
|
||||
| Primitiv | linear | 0 |
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
GenParamName und GenParamValue 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.
ObjectModel3DFrom (input_control) object_model_3d → (handle)
Handle des 3D-Objektmodells mit den Quelldaten.
ObjectModel3DTo (input_control) object_model_3d → (handle)
Handle des 3D-Objektmodells mit den Zieldaten.
Pose (input_control) pose → (real / integer)
Pose der Quelldaten in den Zieldaten.
Defaultwert: []
MaxDistance (input_control) number → (real / integer)
Maximal interessanter Abstand.
Defaultwert: 0
GenParamName (input_control) attribute.name(-array) → (string)
Namen der generischen Parameter.
Defaultwert: []
Werteliste: 'distance_to', 'invert_pose', 'method', 'output_attribute', 'sampling_dist_abs', 'sampling_dist_rel', 'signed_distances', 'store_closest_index'
GenParamValue (input_control) attribute.value(-array) → (string / integer / real)
Werte der generischen Parameter.
Defaultwert: []
Werteliste: 'auto', 'false', 'kd-tree', 'linear', 'points', 'polygons', 'primitive', 'triangles', 'true', 'voxel'
distance_object_model_3d liefert den Wert 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