2D-SceneGraph Transformationen
Verfasst: 19.02.2012, 02:27
Hallo,
ich hab mal ne Anfängerfrage zu OpenGL-Matrix-Transformationen in einem 2D-SceneGraph an die Profis hier...
Ich baue gerade meinen 2D-SceneGraph von Softwarerendering auf OpenGL um, daraus ergeben sich einige Umstellungen. Jede Transformation (translate/rotate/scale) wird nun an die Unterknoten weitergegeben, wie man das eben auch aus 3D-Engine-SceneGraphs so kennt. Soweit hab ich das auch ohne Probleme hingekriegt.
Jetzt bin ich allerdings an einem Problem angelangt, das ich hier hoffentlich verständlich schildern kann (auch wenn ich mir als Neuling hier etwas schwer tue): Ich möchte von einem bestimmten (Unter-)Knoten die Transformations-Matrix wissen, auch wenn ich gerade nicht in der render()-Routine bin. Z. B. brauche ich das für Kollisionserkennung und weitere Sachen.
Das Problem stellt sich erst seit der Umstellung auf OpenGL, und noch nicht vorher, aus folgendem Grund:
Jetzt transformiere ich die GL_MODELVIEW_MATRIX immer mit den glTranslatef(), glRotatef(), glScalef() Methoden und OpenGL erzeugt für mich so nach und nach die Matrix für meinene (Unter-)Knoten.
Vor dieser Umstellung hab ich die Transformations-Matrix für jeden Knoten einzeln selbst berechnet und konnte bisher diesen Schritt natürlich auch einmal willkührlich ausführen, also einen Konten nach seiner Matrix fragen, auch wenn ich nicht gerade diesen Knoten zeichnen wollte...
Mögliche Lösung: Ich könnte jetzt natürlich recht einfach dabei bleiben und das rendern bzw. das schrittweise Zusammenbauen der Transformations-Matrix für jeden Knoten über die OpenGL-Methoden glTranslatef(), glRotatef(), glScalef() machen, und wenn ich zu einem anderen Zeitpunkt außerhalb von SceneGraph.render() eine Matrix für einen Konten brauche, diesen dann wie "früher" selbst über Matrizen-Multiplikation etc. berechnen. Allerdings hab ich zu diesem Verfahren irgendwo aufgeschnappt, dass man OpenGL die Matrix-Transformationen überlassen und das nicht selbst berechnen soll. Für das rendern würde ich das ja auch tun, nur wenn ich sonst einmal eine Matrix brauche (was wahrscheinlich trotzdem sehr oft vorkommt), würde ich diese selbst berechnen. Daraus ergibt sich aber, dass es in meiner Software zwei Verfahren gibt, wie Knoten-Matrizen berechnet werden (einmal über die OpenGL-Funktionen und einmal über eine Matrizen-Berechnung) und das ist vielleicht nicht so schön...
Oder ich berechne einfach wie vorher auch für das rendern die Matrizen selbst. Ist u. U. etwas ungewöhnlich (?), weil es ja für diesen Schritt auch einfacher ginge, aber zumindest hätte ich dann eine zentrale Stelle für die Matrizen-Berechnung der Knoten...
Oder geh ich die Geschichte ganz falsch an? Mir fehlen da irgendwie die best practices...
Thanks a lot!
Stefan
/edit: und sorry für den langen Text, aber ich hatte befürchtet es kommt sonst nicht klar rüber :|
ich hab mal ne Anfängerfrage zu OpenGL-Matrix-Transformationen in einem 2D-SceneGraph an die Profis hier...
Ich baue gerade meinen 2D-SceneGraph von Softwarerendering auf OpenGL um, daraus ergeben sich einige Umstellungen. Jede Transformation (translate/rotate/scale) wird nun an die Unterknoten weitergegeben, wie man das eben auch aus 3D-Engine-SceneGraphs so kennt. Soweit hab ich das auch ohne Probleme hingekriegt.
Jetzt bin ich allerdings an einem Problem angelangt, das ich hier hoffentlich verständlich schildern kann (auch wenn ich mir als Neuling hier etwas schwer tue): Ich möchte von einem bestimmten (Unter-)Knoten die Transformations-Matrix wissen, auch wenn ich gerade nicht in der render()-Routine bin. Z. B. brauche ich das für Kollisionserkennung und weitere Sachen.
Das Problem stellt sich erst seit der Umstellung auf OpenGL, und noch nicht vorher, aus folgendem Grund:
Jetzt transformiere ich die GL_MODELVIEW_MATRIX immer mit den glTranslatef(), glRotatef(), glScalef() Methoden und OpenGL erzeugt für mich so nach und nach die Matrix für meinene (Unter-)Knoten.
Vor dieser Umstellung hab ich die Transformations-Matrix für jeden Knoten einzeln selbst berechnet und konnte bisher diesen Schritt natürlich auch einmal willkührlich ausführen, also einen Konten nach seiner Matrix fragen, auch wenn ich nicht gerade diesen Knoten zeichnen wollte...
Mögliche Lösung: Ich könnte jetzt natürlich recht einfach dabei bleiben und das rendern bzw. das schrittweise Zusammenbauen der Transformations-Matrix für jeden Knoten über die OpenGL-Methoden glTranslatef(), glRotatef(), glScalef() machen, und wenn ich zu einem anderen Zeitpunkt außerhalb von SceneGraph.render() eine Matrix für einen Konten brauche, diesen dann wie "früher" selbst über Matrizen-Multiplikation etc. berechnen. Allerdings hab ich zu diesem Verfahren irgendwo aufgeschnappt, dass man OpenGL die Matrix-Transformationen überlassen und das nicht selbst berechnen soll. Für das rendern würde ich das ja auch tun, nur wenn ich sonst einmal eine Matrix brauche (was wahrscheinlich trotzdem sehr oft vorkommt), würde ich diese selbst berechnen. Daraus ergibt sich aber, dass es in meiner Software zwei Verfahren gibt, wie Knoten-Matrizen berechnet werden (einmal über die OpenGL-Funktionen und einmal über eine Matrizen-Berechnung) und das ist vielleicht nicht so schön...
Oder ich berechne einfach wie vorher auch für das rendern die Matrizen selbst. Ist u. U. etwas ungewöhnlich (?), weil es ja für diesen Schritt auch einfacher ginge, aber zumindest hätte ich dann eine zentrale Stelle für die Matrizen-Berechnung der Knoten...
Oder geh ich die Geschichte ganz falsch an? Mir fehlen da irgendwie die best practices...
Thanks a lot!
Stefan
/edit: und sorry für den langen Text, aber ich hatte befürchtet es kommt sonst nicht klar rüber :|