Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

17.12.2013, 16:30

Viewmatrix im SceneGraph berechnen

Hallo Zusammen

Mein SceneGraph kann in beliebiger Stelle im Baum eine Kamera haben. Die Kamera stellt eine ViewMatrix bereit. Diese wird bisher nur lokal berechnet. Frage ist, wie kriege ich die ViewMatrix zusammen mit der vererbten Matrix zusammen? Die ViewMatrix ist ja eigenlich nichts anderes als eine umgekehrte WorldMatrix. Somit werden die Bewegungen von allen Vatermatrizen eigentlich falsch herum gemacht. Was kann man da machen?

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

17.12.2013, 16:45

Ich habe eine Lösung gefunden, die anscheinend funktioniert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
void Camera::Update()
{
    SceneNode::Update();

    auto globalWorldMatrix = GetWorldMatrix();
    auto determinant = XMMatrixDeterminant(globalWorldMatrix);
    _viewMatrix = XMMatrixInverse(&determinant, globalWorldMatrix);
}


Irgendwelche einwände?

3

17.12.2013, 16:54

Was bei Matrizenproblemen jeder Art hilft es eigentlich immer, sich ein Diagramm zu machen, welche Räume (Koordinationsysteme, Transformationsstufen, oder wie auch immer man es sonst nennen will) man hat und welche Matrizen von wo nach wo transformieren.
Anhand dessen kann man dann sehr hübsch und übersichtlich ablesen, welche Matrizen man kombinieren muss um von A nach B zu kommen. Kombinieren von Matrizen geschieht wie üblich durch Multiplikation, dabei aber unbedingt auf die Reihenfolge achten. Möchte man die Richtung ändern, multipliziert man mit der Inversen.

[edit]Zu deinem Quelltext kann man eigentlich nichts sagen, solange man nichteinmal weiß, was für eine Art Scenengraph du benutzt (oder welche konkrete Bibliothek). Es gibt kein richtig oder falsch, es gibt nur sinnvoll und weniger sinnvoll. Sobald du selbst weißt, was genau du überhaupt machen willst, ist die Lösung eigentlich offensichtlich. Die Kenntnis darüber, wie deine Szene und die Transformationshierarchie aufgebaut ist, musst du selber haben, man müsste schon das ganze Programm kennen um dir dabei helfen zu können.
Lieber dumm fragen, als dumm bleiben!

4

17.12.2013, 16:58

Wie du schon sagtest, ist die ViewMatrix nichts anderes als die Invertierte World-Matrix. Um bei deinem MatrixStack etwas wie "pop()" nutzen zu können, musst du also irgendwo alle Inverses speichern, oder? Wenn ja, dann nimmst du wahrscheinlich am besten die InverseMatrix vom MatrixStack und kopierst sie, da die Neukalkulation von InserseMatrizen ab einer gewissen Häufigkeit ziemlich zeitaufwendig werden kann.

Liebe Grüße,
~ EuadeLuxe ~

5

17.12.2013, 17:16

Wie du schon sagtest, ist die ViewMatrix nichts anderes als die Invertierte World-Matrix.

Also, diesen Sprachgebrauch habe ich wirklich noch nie gehört.

Für mich war View-Matrix immer mehr oder weniger synonym zu Camera-Matrix, also die Matrix, die aus World-Koordinaten in Camera-Koordinaten transformiert. Die World-Matrix ist dann analog die Matrix, die von Model-Koordinaten ind World-Koordinaten transformiert.

Aber man kann eben beliebige Räume definieren, und Bezeichner sind auch nicht immer so konstant, wie man es gerne hätte. Genau deshalb ist es eben wichtig, dass man selber genau weiß, was man denn nun in seinem Programm vorliegen hat. Gerade weil das alles so variabel ist, kann man von außen unmöglich sagen, wie es denn jetzt richtig wäre.
Wenn man es einmal verstanden hat, sind Transformationshierarchien ja auch wirklich nicht schwer. Und bevor man die nicht verstanden hat sollte man eigentlich gar nicht erwarten, irgendetwas in 3D hinkriegen zu können.
Lieber dumm fragen, als dumm bleiben!

MitgliedXYZ

Alter Hase

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

6

17.12.2013, 17:35

Congratulations!
"Sock Puppet" award received.

7

17.12.2013, 17:47

Congratulations!
"Sock Puppet" award received.

Hä?
Lieber dumm fragen, als dumm bleiben!

MitgliedXYZ

Alter Hase

Beiträge: 1 369

Wohnort: Bayern

  • Private Nachricht senden

8

17.12.2013, 17:49

Hä?
http://winterbash2013.stackexchange.com/
Ja, falsche Seite, aber hätte er es auf Stackexchange gepostet, hätte er es bekommen.

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

17.12.2013, 17:57

Um eure Fragen zu beantworten: Ich habe einen eigenen SceneGraph implementiert. Jeder Node vererbt seine gesamte WorldMatrix dem Kind, und die eigene globale WorldMatrix ist localWorldMatrix * parentGlobalWorldMatrix. Das funktioniert super, nur halt wenn die Camera ebend genau auch ein SceneNode ist (Basisklasse), dann brauch ich als Ergebnis halt etwas anderes als die WorldMatrix. Und dafür habe ich oben genannte Lösung gepostet. GetParentMatrix() ist ebend genau die berechnete, globale Weltmatrix des Vater-Nodes.

10

18.12.2013, 09:08

Also wenn du einfach JEDE Matrix Welt-Matrix nennst, ist es ja kein Wunder, dass der Name einen überhaupt nichts mehr sagt.
Welt-Matrix klingt für mich zumindest nach einer relativ speziellen Aufgabe, das was du da hast sich eigentlich einfach nur irgendwelche relativen Transformationen.
Noch ein Tipp: Du kannst deine Matrizen auch "ParentToChild" oder "ChildFromParent" nennen. Letztere Schreibweise ist toll, wenn der Vektor rechts steht:

C-/C++-Quelltext

1
ScreenFromCamera*CameraFromWorld*WorldFromModel*PositionInModel

Hier wäre "PositionInModel" ein Vektor (in Model-Koordinaten) und der Rest Matrizen. Das absolut tolle ist jetzt, dass du alleine am Quellcode schon genau sehen kannst, dass die Transformation richtig ist und dass du am Ende deine Position in Bildschirmkoordinaten erhältst.
Lieber dumm fragen, als dumm bleiben!

Werbeanzeige