gluBeginTrim

Aus DGL Wiki
Wechseln zu: Navigation, Suche

gluBeginTrim, gluEndTrim

Name

gluBeginTrim, gluEndTrim - beginnen und beenden eine NURBS Kurvendefinition.


Delphi-Spezifikation

procedure gluBeginTrim(nobj: PGLUnurbs);
procedure gluEndTrim(nobj: PGLUnurbs);


Parameter

nobj Spezifiziert das NURBS Objekt (erstellt mit gluNewNurbsRenderer).



Beschreibung

Mit gluBeginTrim markiert man den Beginn einer Schnittkurve, mit gluEndTrim entsprechend das Ende.

Eine Schnittkurve (engl: trimming loop) ist ein Satz von orientierten (gerichteten) Kurvensegmenten (bilden eine geschlossene Kurve/Krümmung), welche die Grenzen einer NURBS-Fläche definieren. Die Schnittkurven werden zwischen gluBeginSurface und gluEndSurface aufgerufen.
Um den Sinn dieser Schnittkurven zu verstehen, muss man wissen, dass die NURBS-Flächen potentiell unendlich groß sind. Erst durch Schnittkurven wird den NURBS-Flächen eine endliche Form (z.B. ein Rechteck) gegeben. Durch die Schnittkurven kann man somit "Überschuss" wegschneiden und "Löcher" ausschneiden.


NURBS-Flächen können beliebig viele Schnittkurven enthalten. Wenn man z.B. eine NURBS-Fläche haben möchte die einem Rechteck ähnelt aus dem ein kreisförmiges Loch gestanzt wurde, braucht man 2 Schnittkurven. Die erste gibt der Fläche die rechteckige Form. Die zweite schneidet das Loch aus der Restfläche. Die Definition für jede der beiden Schnittkurven würde durch ein gluBeginTrim-gluEndTrim-Paar eingefasst werden.


Schnittkurven selbst können aus beliebig vielen Kurvensegmenten bestehen. Es gibt 2 verschiedene Kurvensegmenttypen: Stückweise lineare Kurvensegmente werden mittels gluPwlCurve definiert, einfache NURBS-Kurvensegmente mittels gluNurbsCurve. Die beiden genannten Aufrufe (gluPwlCurve und gluNurbsCurve) sind gleichzeitig die einzigen GLU-Befehle die innerhalb einer Schnittkurvendefinition (also zwischen gluBeginTrim und gluEndTrim) erlaubt sind.


Durch die Schnittkurve wird die NURBS-Fläche in zwei Bereiche geteilt. Der eine ist sichtbar, der andere wird verworfen. Der sichtbare Bereich ist der, welcher links von der Schnittkurve liegt, wenn man der Kurve folgt (ansteigende Kurvenparameter). Folglich liegt der Rest der NURBS Fläche innerhalb einer CCW Schnittkurve und außerhalb einer CW Schnittkurve. (CCW = Counter Clock Wise = Gegen den Uhrzeigersinn; CW = Clock Wise = Im Uhrzeigersinn)

Für das oben angesprochene Rechteck heißt dies: Die Schnittkurve welche die Rechteckform herstellt ("den Überschuss abscheidet") verläuft gegen den Uhrzeigersinn. Die Schnittkurve, welche das Loch ausschneidet ("ausstanzt"), läuft im Uhrzeigersinn.


Wenn mehrere Kurvensegmente zu einer Schnittkurve zusammengestellt werden sollen, muss sichergestellt sein, dass die Segmente eine geschlossene Kurve bilden. (Das heißt der Startpunkt der (i+1)-ten Kurve ist gleich dem Endpunkt der (i)-ten Kurve, und der Endpunkt der letzten Kurve ist gleich dem Startpunkt der ersten Kurve.) Wenn die Start- und Endpunkte ausreichend nahe beieinander sind (aber nicht gleich) werden sie zusammengezogen. Liegen die entsprechenden Punkte zuweit auseinander, wird ein Fehler ausgelößt. (siehe gluNurbsCallback)


Wenn eine Schnittkurve aus mehrere Kurven besteht, muss die Orientierung für alle Teilkurven gleich sein. (d.H. die Innenseite liegt links von allen Kurven)

Geschachtelte Schnittkurven sind zulässig, solange die Orientierung der Kurven korrekt wechselt (alterniert).

Schnittkurven dürfen weder sich selbst noch andere Schnittkurven schneiden. (Anderenfalls wird ein Fehler ausgelöst)


Wenn für eine NURBS-Fläche keine Schnittkurven definiert wurden, wird die Fläche komplett gezeichnet.


Beispiel

Die folgenden Befehle rendern eine Schnittkurve bestehend aus einer stückweise linearen Kurve und 2 NURBS-Kurven:

gluBeginTrim(nobj);
   gluPwlCurve(..., GLU_MAP1_TRIM_2);
   gluNurbsCurve(..., GLU_MAP1_TRIM_2);
   gluNurbsCurve(..., GLU_MAP1_TRIM_3);
gluEndTrim(nobj);


Siehe auch

gluBeginSurface, gluNewNurbsRenderer, gluNurbsCallback, gluNurbsCurve, gluPwlCurve