#include <CBSplineWrapperEffect.h>
Inheritance diagram for CBSplineWrapperEffect::
Die Klasse CBSplineWrapperEffect implementiert den B-Spline-Wrapper-Effekt mit seiner gesamten funktionalität. Da sie von GLEffect abgeleitet ist, kann sie leicht in das GLFramework integriert werden.
|
Die Enumeration enmAnimationMode enthält alle Konstanten, die den Animationsmodus der Klasse CBSplineWrapperEffect steuern. |
|
Die Enumeration enmTranslationMode enthält alle Konstanten, die den Manipulationsmodus der Klasse CBSplineWrapperEffect für Kontrolvertices steuern. |
|
Die Enumeration enmDeformationMode enthält alle Konstanten, die den Deformationsmodus der Klasse CBSplineWrapperEffect steuern. |
|
Die Enumeration enmEffectMOde enthält alle Konstanten, die den Effektmodus der Klasse CBSplineWrapperEffect steuern. |
|
Die Enumeration enmTranslationState enthält alle Konstanten, die den aktuellen Bearbeitungszustand der Klasse CBSplineWrapperEffect angeben.
|
|
Die Enumeration enmMorphingEditState enthält alle Konstanten, die den aktuellen Morphingbearbeitungszustand der Klasse CBSplineWrapperEffect angeben. |
|
Die Enumeration enmKnotMatrixType enthält alle Konstanten, die den aktuellen Knotenmatrixbearbeitungszustand der Klasse CBSplineWrapperEffect angeben. |
|
Der Konstruktor erzugt eine Instanz der Klasse CBSplineWrapper. Die Struktur effectInfo wird zunächst initialisert, der Effekt unterstützt zwei Bildlisten. Alle Zeigerreferenzen werden auf NULL gesetzt. Danach werden die Deformationsalgorithmen-Klassen erzegut und in die Algorithmenliste aufgenommen. Anschließend werden alle Steuerelemente verborgen.
|
|
Die Methode createControls() erzeugt die vom Effekt zur Verfügung gestellten Steuerelemente. Sie erzeugt ein Panel in der rechten Leiste des Frameworks, welches Checkboxen zum Konfigurieren des Zeichenmodus des Effekts beinhaltet und ein Panel zum einstellen der Animationsabspielparameter. Ferner erzegut sie ein Top-Level-Toolfenster, welches Steuerelemente zur Einstellung der Bearbeitungsmodi, der Gitter-, B-Spline- und Keyframe-Parameter bereitstellt. Die Steuerelemente werden anschließend mit Standardwerten vorbelegt. Reimplemented from GLEffect. |
|
Die Methode stop() hält eine laufende Animation an. Das Effekttoolfenster wird wieder eingeblendet, der Animationstimer gestoppt. Reimplemented from GLEffect. |
|
Die Methode play() startet den Abspielvorgang im Morphing, oder Keyframemodus. Dieser wird nur dann gestartet, wenn sich mehr als 1 Keyframe in der Liste befindet. Die Methode startet den Animationstimer, der die Animation in regelmäßigen Abständen aktualisiert. Das Toolfenster des Effekts wird durch die Methode versteckt. Reimplemented from GLEffect. |
|
Die Methode reset() setzt den Effekt in seinen Ausgangszustand zurück. Eine mögliche Animation wird zunächst angehalten. Danach werden alle erzeugten OpenGL-Texturobjekte gelöscht. Der aktive Deformer wird von den Gittern getrennt. Die Gitter werden von ihren Painte-Objekten ebenfalls getrennt. Danach werden initialize() und initializeGUI() aufgerufen, um die Standardzustände des Effekts zu initialisieren. Reimplemented from GLEffect. |
|
Die Methode stop() unterbricht eine laufende Animation. Das Effekttoolfenster wird dabei nicht wieder eingeblendet, es wird lediglich der Animationstimer gestoppt. Reimplemented from GLEffect. |
|
Die Methode render() rendert den Effekt. Je nach Konfiguration der Darstellungsmodi wird zunächst das texturierte Bildgittergezeichnet, danach das Bildgitter im Wireframemodus, dann das Kontrollgitter und anschließend die Kontrollgitterpunkte. Die Methode zeichnet ebenfalls ein Fadenkreuz und die Punkteselektionsbox. Im Morphingmodus wird das texturierte Bildgitter zweimal gezeichnet. Einmal mit der aktuellen Textur der Quellbildsequenz, einmal mit der Textur der aktuellen Textur der Zielbildsequenz. Dabei variiert jedesmal der Alphablending wert, in abhängigkeit des Morphingzeitindex. Für das Rendern des Quellgitters wird TexelmeshA verwendet, für das Rendern des Zielgitters wird TexelmeshB verwendet. Die Methode render() ruft jedesmal ebenfalls die Methode deform() des gerade aktiven Deformationsalgorithmus auf. Im Morphingmodus werden dabei jedesmal die Texelkoordinaten neuberechnet, so daß die Verzerrung keinerlei Auswirkungen auf das Bild hat. Das Zeichnen der Gitter wird mit Hilfe des Objekts CGridPainter bewerkstelligt. Reimplemented from GLEffect. |
|
Der Event-Handler mouseMoveEvent() behandelt das verschieben des Mauszeigers. Hier wird das Transformieren von Kontrollpunkten und das ziehen einer Selektionsbox implementiert.
Reimplemented from GLEffect. |
|
Der Event-Handler mousePressEvent() behandelt das Niederdrücken von Maustasten. Hier wird das selektieren von Punkten implementiert. Ebenfalls werden hier die Kontrollpunktmanipulationsmodi initialisiert.
Reimplemented from GLEffect. |
|
Der Event-Handler mouseReleaseEvent() behandelt das Loslassen von Maustasten. Hier wird der Bearbeitungszustand zurückgesetzt und der GLView aktualisiert.
Reimplemented from GLEffect. |
|
Der Event-Handler mousePressEvent() behandelt das Drücken von Tasten. Hier werden die in der Anwendung zugänglichen Schnelltasten implementiert, welche die wichtigsten Optionen aktivieren. Reimplemented from GLEffect. |
|
Die Methode selectAll() fügt alle Kontrollpunkte zur Selektion hinzu. |
|
Die Methode unselectAll() setzt die Selektion aller Kontrollpunkte zurück. |
|
Die Methode setBorderLock() aktiviert, oder deaktiviert die Bewegungsbeschränkung für die Kontrollgitterandpunkte. Beim aktivieren setzt diese gleichzeitig die Randpunkte an ihre ursprüngliche Position zurück. |
|
Die Methode setPaintImage() aktiviert, oder deaktiviert das Zeichnen des Bildes |
|
Die Methode setPaintImageMesh() aktiviert, oder deaktiviert das Zeichnen des Bildgitters. |
|
Die Methode setControlMesh() aktiviert, oder deaktiviert das Zeichnen des Kontrollgitters. |
|
Die Methode setControlMeshVertices() aktiviert, oder deaktiviert das Zeichnen der Kontrollpunkte. |
|
Die Methode setControlMeshVerticalResolution() ändert die vertikale Auflösung des Kontrollgitters. Hierzu wird die Methode resizeControlMesh() aufgerufen. Der Effekt wird anschließend neu gerendert. |
|
Die Methode setControlMeshHorizontalResolution() ändert die horizontale Auflösung des Kontrollgitters. Hierzu wird die Methode resizeControlMesh() aufgerufen. Der Effekt wird anschließend neu gerendert. |
|
Die Methode setImageMeshHorizontalResolution() ändert die horizontale Auflösung des Bildgitters. Hierzu wird die Methode resizeImageMesh() aufgerufen. Der Effekt wird anschließend neu gerendert. |
|
Die Methode setImageMeshVerticalResolution() ändert die vertikale Auflösung des Bildgitters. Hierzu wird die Methode resizeImageMesh() aufgerufen. Der Effekt wird anschließend neu gerendert. |
|
Die Methode setAnimationMode() setzt einen der drei Animationsmodi.
|
|
Die Methode setTranslationMode() ändert den Punktmanipulationsmodus und aktualisiert die zugehörige. Schaltfläche.
|
|
Die Methode setDeformationMode() ändert den Deformationsalgorithmus des Effekts und aktualisiert die zugehörigen Steuerelemente. Eine bestehende Kontrollpunktselektion wird zurückgesetzt. Im Falle von B-Spline-Deformation wird geprüft, ob die Kontrollgitterauflösung zulässig ist, und danach angepaßt, wenn nötig.
|
|
Die Methode setEffectMode() ändert den Effektmodus und aktualisiert die zugehörigen Steuerelemente. Der jeweilige Effektmodus wird mit seinen Standardwerten initialisiert. Im Falle von Keyframe-Interpolation wird eine Keyframenavigationsleiste eingeblendet. Im Falle von Morphing wird eine Morphingnavigationsleiste angezeigt. Bevor in den Morphingmodus geschaltet wird, wird geprüft, ob in jeder Bildliste des Frameworks mindestens ein Bild vorhanden ist. Ist dies der Fall, so erscheint eine Meldung und der Effektmodus wird nicht umgestellt.
|
|
Die Methode setActiveKnotMatrix() setzt die zu bearbeitende Knotenmatrix. Dabei wird der Inhalt des Tabellewidgets entsprechend aktualisiert.
|
|
Die Methode setSplineOrder() ändert die Ordnung der B-Spline-Kurven. Im Falle, dass Keyframes gesetzt wurden wird der Wert Order auf das Minmum der Kontrollgittergröße limitiert. Ebenfalls werden die Spinboxen zur Einstellung der Kontrolgitterauflösung nach unten hin durch Order beschränkt. Die Routine setzt anschließend die Ordnung des B-Spline-Deformationsalgorithmus und berechnet die Deformation neu. Ebenfalls wird die Ansicht der Knotenmatrixtabelle aktualisiert. Falls Morphing aktiviert ist, so werden die Koordinaten aller Texelgitter neu berechnet. |
|
Die Methode setAnimationSpeed() setzt die Abspielgeschwindigkeit für Animationen. |
|
Die Methode insertKeyFrame() erzeugt einen Keyframe anhand des aktuellen Kontrollgitters. Das Keyframe wird an der Stelle eingefügt, an der sich der Framecursor befindet. Der Cursor wird um CURSOR_STEP Zeiteinheiten nach rechts verschoben. Die Zeitskalenansicht wird aktualisiert. |
|
Die Methode deleteKeyFrame() löscht den gerade selektierten Keyframe. Die Zeitskalenansicht wird aktualisiert. |
|
Die Methode gotoZero() verschiebt den Framecursor an die Position 0.0. Die Zeitskalenansicht wird aktualisiert. |
|
Die Methode gotoFirstKeyFrame() setzt den Framecursor auf das erste Keyframe. Das Keyframe wird selektiert. Die Zeitskalenansicht wird aktualisiert. |
|
Die Methode gotoNextKeyFrame() setzt den Framecursor auf das Keyframe, welches direkt nach dem gerade selektierten Keyframe folgt. Das neue Keyframe wird selektiert. Die Zeitskalenansicht wird aktualisiert. Ist kein Keyframe selektiert gewesen, so zeigt die Methode keinerlei Wirkung. |
|
Die Methode gotoLastKeyFrame() setzt den Framecursor auf das letzte Keyframe. Das Keyframe wird selektiert. Die Zeitskalenansicht wird aktualisiert. |
|
Die Methode gotoNextKeyFrame() setzt den Framecursor auf das Keyframe, welches dem gerade selektierten Keyframe vorangeht. Das neue Keyframe wird selektiert. Die Zeitskalenansicht wird aktualisiert. Ist kein Keyframe selektiert gewesen, so zeigt die Methode keinerlei Wirkung. |
|
Die Methode controlMeshToSource() kopiert das aktuelle Kontrollgitter in das Morphingquellgitter. Das aktuelle Arbeitstexelmesh wird ebenfalls dem Morphingquelltexelmesh zugewiesen. Der Effekt wird anschließend neu gerendert. |
|
Die Methode controlMeshToDestination() kopiert das aktuelle Kontrollgitter in das Morphingzielgitter. Das aktuelle Arbeitstexelmesh wird ebenfalls dem Morphingzieltexelmesh zugewiesen. Der Effekt wird anschließend neu gerendert. |
|
Die Methode sourceToControlMesh() kopiert das Morphingquellkontrollgitter in das aktuelle Kontrollgitter. Das Morphingquelltexelmesh wird dem Arbeitstexelmesh zugewiesen. Ferner wird das erste Bild der Quellmorphingbildsequenz aktiviert. Der Effekt wird anschließend neu gerendert. |
|
Die Methode destinationToControlMesh() kopiert das Morphingzielkontrollgitter in das aktuelle Kontrollgitter. Das Morphingzieltexelmesh wird dem Arbeitstexelmesh zugewiesen. Ferner wird das letzte Bild der Zielmorphingbildsequenz aktiviert. Der Effekt wird anschließend neu gerendert. |
|
Die Methode clearKeyFrames() löscht alle Keyframes aus der Keyframeliste. Die Zeitskalenansicht wird danach aktualisiert. Der Benutzer wird vorher gefragt, ob er wirklich alle Keyframes löschen möchte. |
|
Die Methode resetControlMesh() setzt das Kontrollgitter zurück auf ein reguläres rechteckiges Gitter. Der Effekt wird anschließend gerendert. |
|
Die Methode resetKnotMatrix() setzt beide Knotenmatrizen auf uniforme und normalisierte Matrizen zurück. Hierzu wird die Methode buildUniformNodeMatrices() der Klasse CBSplineDeformer benutzt. Das Tabellenwidget wird mittels knotMatrixToTable() aktualisiert. Der Effekt wird anschließend neu gerendert. |
|
Die Methode finishInterpolate() finalisiert das manuelle Interpolieren. Im Morphing-Modus wird dabei zu dem Kontrollgitter zurückgesprungen, welches zuletzt bearbeitet wurde, d.h. entweder zum Quellkontrollgitter, oder zum Zielkontrollgitter. |
|
Die Methode interpolate() interpoliert das Kontrollgitter am Zeitpunkt TimeIndex. Dabei werden zunächst das Keyframepaar ermittelt, in dessen Zeitintervall sich TimeIndex befindet. Danach wird mittels der Klasse CGridInterpolator das Kontrollgitter zwischen den beiden Keyframes interpoliert. Anschließend wird das Bildgitter neu deformiert. Der Effekt wird danach gerendert. Die Methode sorgt auch dafür, dass im Falle von geladenen Bildsequenzen das zum Zeitpunkt Timeindex zugehörige Bild ermittelt wird. Die Bilder der Bildsequenzen werden dabei gleichmäßig auf den durch die Keyframes gebildete Gesamtzeitspanne verteilt. |
|
Die Methode animate() aktualisiert die Animation. Über die interpolate() Methode wird der neue Zustand berechnet. Danach wird die Framecursorposition aktualisiert in Abhängigkeit vom gesetzten Animationsmodus. |
|
Die Methode updateKnotMatrix() kopiert das durch row und col spezifizierte Element aus dem Tabellenwidget, in die gerade aktive Knotenmatrix. Es werden zuvor einige Plausibilitäts- und Bereichsprüfungen durchgeführt. Falls diese Fehlschlagen, so wird der Benutzer darüber informiert, und die Änderung rückgängig gemacht. Danach wird der Effekt neu gerendert. |
|
Die Methode initialize() initialisiert den Effekt mit Standardwerten. Auch die GUI-Elemente werden mit Werten vorbelegt. Die Methode erzeugt alle Gitter und nötigen dynamischen Strukturen. Reimplemented from GLEffect. |
|
Die Methode initializeGUI() belegt alle Steuerelemente des Effekts mit Standardwerten. Der Effekt wird in den Keyframemodus zurückgesetzt. Der Manipulationsmodus wird auf "Move" gesetzt. Der Lineare Deformationsalgorithmus wird aktiviert. Alle Keyframes werden gelöscht. Die Animationseinstellungen werden zurückgesetzt. Die Zeichenmoduseinstellungen ebenfalls. Die Gitter werden alle 2 x 2 dimensioniert. Die Splineordnung wird ebenfalls auf 2 zurückgesetzt. |
|
Die Methode getControlPlaneCoordinates() projiziert die Mauskoordinaten zurück auf die Kontrollgitterebene. Das Ergebnis wird in ControlGridPlaneU und ControlGridPlaneV abgelegt.
|
|
Die Methode enableControlMeshResolutionPanel() aktiviert oder deaktiviert die Spinboxen, welche für die Einstellung der horizontalen und der vertikalen Kontrollgitterauflösung zuständig sind. |
|
Die Methode enableKnotMatrixPanel aktiviert oder oder deaktiviert die Steuerelemente die zur Bearbeitung der Knotenmatrizen dienen. |
|
Die Methode resizeControlMesh() ändert die Größe des Kontrollgitters. Hierzu wird das Bildgitter zunächst zurückgesetzt, so dass es wieder regulär ist. Dann wird ein Backup des Kontrollgitters erzeugt. Es wird ebenfalls ein reguläres temporäres Kontrollgitter erzeugt, welches dieselben Ausmaße aufweist wie das gerade aktive. Danach wird ein neues Kontrollgitter mit der neuen Auflösung erzeugt. Das neue Kontrolgitter wird nun an den aktiven Deformationsalgoritmus zusammen mit dem zurückgesetzen Bildgitter verbunden. Nun wird ein CLinearDeformer -Objekt dazu verwendet das neue Kontrollgitter durch mit dem alten zu verformen. Danach hat das neue Kontrollgitter eine ähnliche Form, wie das alte. Die temporären Objekte werden freigegeben. Die neuen Gitter werden neu gebunden an die CGridPainter -Objekte. Im Morphingmodus werden zusätzlich die Texelkoordinaten neu berechnet. Im B-Splinemodus werden neue Knotenmatrizen erzeugt und die Tabelle aktualisiert. |
|
Die Methode resizeImageMesh() ändert die Auflösung des Bildgitters. Hierzu wird zunächst der aktive Deformationsalgorithmus von allen gittern getrennt. Es wird ein Backup des Kontrollgitters erzeugt, danach wird das Kontrollgitter auf ein reguläres Gitter zurückgesetzt. Nun wird ein neues Bildgitter mit der gegebenen Auflösung erzeugt. Ebenfalls werden die Texelgitter neu skaliert und mit Standardwerten belegt. Die Gitter werden wieder an den aktiven Deformer gebunden. Danach wird der alte Zustand der Kontrollgitterpunkte wiederhergestellt. Das Bildgitter wird dann mit dem aktiven Deformer neu berechnet. Zum Schluss werden die Bindungen an die CGridPainter -Objekte wiederhergestellt. Im Morphingmodus werden zusätzlich die Texelkoordinaten aller Texelgitter nach dem defomrieren neu berechnet, so daß dei Textur unverzerrt erscheint. |
|
Die Methode setActiveDeformer() ändert den aktiven Deformationsalgorithmus. Dabei werden zunächst die Gitterbindungen zum alten Algorithmus aufgelöst. Danach wird ein Backup des Kontrollgitters erzeugt. Das Kontrollgitter und das Bildgitter werden anschließend auf reguläre Gitter zurückgesetzt. Nun wird der neue aktive Deformer gesetzt und die Gitter mit ihm verbunden. Danach wird der alte Zustand des Kontrollgitters wiederhergestellt und das Bildgitter mit dem neuen Deformationsalgorithmus verzerrt. Schließlich werden die Bindungen an die CGridPainter -Objekte wiederhergestellt. Im Morphing-Modus werden die Texelkoordinaten aller Texelgitter nach dem Deformieren neu berechnet. |
|
Die Methode selectBoxedVertices() ermittelt alle Kontrollpunkte, die sich in der Selektionsbox befinden und fügt diese zur Selektion hinzu. Der Parameter clear legt fest, ob zuvor die bereits bestehende Selektion zurückgesetzt werden soll. |
|
Die Methode lockBorderVertices() setzt die Randkontrollgitterpunkte an ihre ursprünglichen Koordinaten, so dass diese nur noch entlang der rechteckigen Gitterkanten verschoben werden können. Die Eckpunkte werden dadurch unbeweglich gemacht. |
|
Die Methode buildRegularMesh() erzeugt mit Hilfe der Klasse CMeshBuilder ein regelmäßiges rechteckiges Gitter. Die Parameter origX und origY geben die linke obere Ecke des Gitters in Weltkoordinaten an. Die Parameter width und height geben die Ausdehnung des Gitters in Weltkooridnaten an. Die Parameter ResH und ResV legen schließlich die Auflösung des Gitters fest. Die Referenz auf das dynamisch erzegute CGrid -Objekt wird in Mesh abgelegt. |
|
Die Methode makeRegularMesh() verhält sich analog zur Methode buildRegularMesh(). Sie erzeugt jedoch kein neues CGrid-Objekt, sondern berechnet die Vertexkoordinaten des über Mesh spezifizierten Gitters neu. Aus diesem Grunde entfällt auch die Angabe der Gitterauflösung.
|
|
Die Methode getPlaneRayIntersection() berechnet den Schnittpunkt zwischen einem durch rayOrigin und rayDirection spezifizierten Strahl und einer durch planeOrigin, planeU und PlaneV parametrisierten Eben. Das Resultat wird in resultU und resultV zurückgegeben, d.h. der Schnittpunkt wird in Ebenenkoordinaten zurückgeliefert. Die Methode gibt true zurück, wenn ein Schnittpunkt existiert, false sonst. In diesem Fall sind resultU und resultV undefiniert. |
|
Die Methode getControlPointAtMouse() liefert die Gitterindices des Kontrollunkts zurück, der sich unter dem Mauszeiger befindet. Der Parameter threshold gibt dabei einen Schwellwert an, der bestimmt wie nah ein Punkt an der Maus sein muss damit er als angewählt angesehen wird. Die Parameter mx und my müssen die bereits auf die Kontrollgitterebene umgerechneten Mauskoordinaten sein. Die Methode liefert das Ergebnis in pntCol und pntRow zurück. Die Methode gibt true zurück, falls ein Punkt getroffen wurde, false sonst. In diesem Fall sind pntCol und pntRow gleich -1.
|
|
Die Methode selectControlPoint() markiert den über x und y spezifizierten Kontrollgitterpunkt. Dazu wird er in die Liste der markierten Punkte aufgenommen und seine Farbe auf die eines Markierten Punkts gesetzt. |
|
Die Methode moveSelectedControlPoints() verschiebt alle markierten Kontrollgitterpunkte um den Vektor Delta. Dazu wird die Liste der markierten Punkte durchlaufen und auf jeden Punkt der Vektor Delta addiert. |
|
Die Methode rotateSelectedControlPoints() rotiert alle markierten Kontrollgitterpunkte um den Punkt Center um den Winkel Angle. Dazu wird von jedem selektierte Punkt zunächst der Vektor Center abgezogen. Anschließend wird jeder selektierte Punkt mit einer 2x2 Drehmatrix multipliziert. Schließlich wird der Vektor Center wieder auf jeden Punkt aufaddiert. |
|
Die Methode scaleSelectedControlPoints() skaliert alle markierten Kontrollgitterpunkte um den Punkt Center mit den Faktoren stretchX und stretchY. Dazu wird von jedem selektierte Punkt zunächst der Vektor Center abgezogen. Anschließend wird jeder selektierte Punkt mit einer 2x2 Skalierungsmatrix multipliziert. Schließlich wird der Vektor Center wieder auf jeden Punkt aufaddiert. |
|
Die Methode resolveGridBindigs() löst alle Bindungen der verschiedenen Gitter auf. Hierzu werden die Bindungen an die CMeshPainter -Objekte aufgelöst und ebenfalls an die Deformer-Klassen. |
|
Die Methode bindActiveDeformer() verbindet die Gitter mit dem gerade aktiven Deformationsalgorithmus, d.h. Das Bildgitter und das Kontrollgitter werden dem Algorithmus zugewiesen. |
|
Die Methode unbindActiveDeformer() löst die zum aktiven Deformationsalgorithmus bestehenden Gitterverbindungen auf, d.h. das Kontrollgitter und das Bildgitter werden vom Algorithmus getrennt. |
|
Die Methode intializeKeyFrameMode() initialisiert den Keyframe-Modus des Effekts. Dabei werden alle Keyframes gelöscht, das Verschieben der Keyframes aktiviert und das Sperren der Randpunkte wiede deaktiviert. Der Framecursor wird an die Position 0 zurückgesetzt. Ebenfalls werden die Steuerelemente zum Einstellen der Kontrollgitterauflösung wieder aktiviert. |
|
Die Methode intializeMorphingMode() initialisiert den Morphing-Modus des Effekts. Dabei werden zwei feste Keyframes an den Stellen 0.0 und 1.0 mit dem aktuellen Kontrollgitterzustand eingefügt. Das Verschieben der Keyframes wird deaktiviert, das Sperren der Randpunkte wiede aktiviert, Der Framecursor wird an die Position 0 zurückgesetzt. Ebenfalls werden die Steuerelemente zum Einstellen der Kontrollgitterauflösung wieder deaktiviert. Ferner werden die Texelkoordinaten neu berechnet, so dass die Verzerrung des Bildgitters keinerlei Auswirkungen zeigt. |
|
Die Methode recalculateTexelCoordinaes berechnet die Texelkoordinaten des Gitters TexelMesh anhand des Bildgitters ImageMesh neu. Dabei werden die Koordinaten einfach planar auf das ImageMesh neu projiziert, so dass anschließend das sich darauf befindende Bild unverzerrt erscheint. |
|
Die Methode knotMatrixToTable() kopiert den Inhalt der durch matrixType spezifizierten KnotenMatrix des B-Spline-Alogrithmus in das Tabellen-Widget des Effekttoolfensters. |
|
Die Methode recalculateMorphingTexelCoordinates() berechnet die Quell- und Zeilmorphingtexelkoordinaten neu. Zuerst wird dazu ein Backup des Kontrollgitters erzeugt. Danach wird dem Kontrollgitter das Quellmorphinggitter zugewiesen. Das Bildgitter wird nun mit dem aktiven Deformer verzerrt. Jetzt werden die Quellmorphingtexelkoordinaten neu berechnet. Anschließend wird dem Kontrollgitter das Zielmorphinggitter zugewiesen und dieselbe Prozedur für die Zielmorphingtexelkoordinaten wiederholt. Zuletzt wird der alte Zustand des Kontrollgitters wiederhergestellt. |