3D-Transformationen



  • Hallo,

    ich arbeite mich momentan in das Thema der Transformationen ein und habe diesbezüglich eine Frage, die ich - vermutlich mangels fehlendem Fachwortschatz - bisher nicht selbst beanworten konnte, weil ich nicht weiß wonach ich suchen soll.

    Und zwar geht es mir um folgendes:
    Angenommen ich habe irgendeine Usereingabe, anhand der eine entsprechende Transformation ausgeführt werden soll. Macht es nun einen Unterschied, ob ich die "Welt" inklusive aller ihrer Objekte transformiere oder die inverse Transformation auf die Kamera anwende? (oder vice versa, je wofür die Transformation gebaut wurde).

    Momentan ändere ich immer die Kamera selbst und bin z.B. beim Ändern der "Blickrichtung" auf das Problem gestoßen, dass ich sie zuvor immer auf den Nullpunkt verschieben, rotieren und dann wieder auf die ursprüngliche Position setzen musste. Kann man das Problem beheben, wenn man die Kamera im Ursprung belässt und statt dessen den Rest der Welt entgegengesetzt dreht?

    Sorry, falls dies hier ungenau beschrieben oder trivial zu beantworten ist, aber das ist alles noch sehr neu und ich hab noch keinerlei Überblick 😃



  • "Die Welt" existiert üblicherweise nicht als eigene Entität in einem 3D Programm, sie definiert sich nur über die Objekte die sich in ihr befinden. Dementsprechend kannst du da auch nichts drehen, du müsstest ja jedes Objekt in der Welt umfrickeln. (Was Quatsch ist.)

    Aber bevor man deine Frage beantworten kann: Wie speicherst du denn Position und Rotation deiner Objekte?



  • Transform schrieb:

    Macht es nun einen Unterschied, ob ich die "Welt" inklusive aller ihrer Objekte transformiere oder die inverse Transformation auf die Kamera anwende? (oder vice versa, je wofür die Transformation gebaut wurde).

    Nein, das ist äquivalent. Allerdings halte ich es für sehr unwahrscheinlich, dass es in deinem Fall auch sinnvoll ist, es so rum zu machen...



  • Vielen Dank für für die Antworten.

    cooky451 schrieb:

    Aber bevor man deine Frage beantworten kann: Wie speicherst du denn Position und Rotation deiner Objekte?

    Ich arbeitete zur Zeit in C# und der WPF (Viewport3D). Dort ist an jedem darstellbaren Objekt eine Transformation (Matrix) als State hinterlegt. Genauso verhält es sich auch mit der Kamera. Die Position und Rotation sind also implizit in dieser Matrix enthalten.

    Allerdings halte ich es für sehr unwahrscheinlich, dass es in deinem Fall auch sinnvoll ist, es so rum zu machen...

    Alle Objekte zu transfomieren? Und wenn ja, warum ist es nicht sinnvoll?



  • Transform schrieb:

    Allerdings halte ich es für sehr unwahrscheinlich, dass es in deinem Fall auch sinnvoll ist, es so rum zu machen...

    Alle Objekte zu transfomieren? Und wenn ja, warum ist es nicht sinnvoll?

    Was denkst du ist effizienter, immer sämtliche Objekte zu transformieren oder einfach nur die Kameratransformation zu ändern?



  • dot schrieb:

    Transform schrieb:

    Allerdings halte ich es für sehr unwahrscheinlich, dass es in deinem Fall auch sinnvoll ist, es so rum zu machen...

    Alle Objekte zu transfomieren? Und wenn ja, warum ist es nicht sinnvoll?

    Was denkst du ist effizienter, immer sämtliche Objekte zu transformieren oder einfach nur die Kameratransformation zu ändern?

    Die Frage hätte ich zu Beginn meiner Recherchen sofort mit "natürlich ist es effizienter, nur die Kamera zu bewegen" beantwortet.
    Nur dann stolperte ich über mehrere Texte, in denen behauptet wurde, dass die Kamera meist fest gehalten wird und nur selten transfomiert wird. Dass sie meist im Ursprung gehalten wird und der Rest der Szene entgegengesetzt transformiert wird (meist im Zusammenhang der Spieleprogrammierung). Warum sollte man sich also für das weniger effizientere Verfahren entscheiden, wenn es doch so offensichtlich ist? 😉

    Außerdem fand ich es erstaunlich, dass OpenGL z.B. keine direkte Manipulation der Kamera erlaubt, sondern genau das oben beschriebene Vorgehen erzwingt, wie hier zu lesen ist.
    Deswegen frage ich auch hier nochmal nach. In vielen Quellen findet man diese "üblichen Vorgehensweisen" beschrieben, aber nirgendwo wird auch nur ansatzweise erklärt, warum dies auch sinnvoll ist / welche Vorteile es bringt etc.



  • Transform schrieb:

    In vielen Quellen findet man diese "üblichen Vorgehensweisen" beschrieben, aber nirgendwo wird auch nur ansatzweise erklärt, warum dies auch sinnvoll ist / welche Vorteile es bringt etc.

    Was die dir sagen wollen ist, dass OpenGL kein Ding wie die Kamera kennt. Daher kannst du auch nichts verschieben. Dein Programm kennt allerdings eine Kamera, und die kannst du sehr wohl verschieben. Nur halt, dass du am Ende diese Transformationen zusammenrechnest und es OpenGL so erscheint, als wäre die ganze Welt transformiert worden statt der Kamera. (Diese Berechnungen passieren dann üblicherweise im Shader.)



  • Keine Grafik API kennt heutzutage überhaupt noch sowas wie Objectspace, Worldspace, Viewspace etc. Sowas wie eine Kamera ist natürlich nur ein Konzept. Letztenendes kommt es nur drauf an was deine Shader ausspucken. Nichts desto trotz ist es nützlich, sowas wie eine Kamera zu haben, auch wenn am Ende natürlich nur irgendwelche Matritzen multipliziert werden...


Anmelden zum Antworten