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 Schwellwert 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- Ungefähre Eigenschaften
Zeit Suchzeit
----------------------------------------------------------------------------
Punkte linear 0 O(N) - Keine Vorberechnung
- Schnellste Methode für kleine N
- Standardmethode für N<100
Punkte kd-tree O(N log(N)) O(log(N)) - Schnelle Vorberechnung
- Nicht-konstante Suchzeit
- Standardmethode für N>=100
Punkte voxel O(N log(N)) O(log(log(N))) - Langsame Vorberechnung
- Sehr schnelle Suche
- Standardmethode für Vorberechnung mit
distance_object_model_3d
Dreiecke linear 0 O(N) - Keine Vorberechnung
- Schnellste Methode für kleine N
- Standardmethode
Dreiecke kd-tree O(N log(N)) O(log(N)) - Schnelle Vorberechnung
- Nicht-konstante Suchzeit
Dreiecke voxel O(N log(N)) O(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 O(1)
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 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