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

DarioFrodo

Treue Seele

  • »DarioFrodo« ist der Autor dieses Themas

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

1

17.01.2012, 10:40

Matrixberechnung, aus 2 Rotationsmatritzen eine 3. erzeugen, welche die Differenz darstellen soll

Hallo Ihr lieben,

ich weiß nicht mal ob das überhaupt möglich ist.
Aber was ich suche, ist ein Weg, aus 2 Rotationsmatrizen eine 3. Matrix zu berechnen.
Mit dieser 3. Matrix soll man ein Objekt um den Wert rotieren können, um den sich die erste Matrix von der 2. unterscheidet.

Der Hintergrund ist dieser:
Es ist wiedereinmal für mein Projekt names SpaceCraft, genauer für den Realtime Planeten Renderer.
Ich verwende eine Ebene oder Vertex-Gitter für die Geometriedarstellung.
Diese Gitter moduliert immer den aktuell sichtbaren Teil der Kugel. Desto weiter man von der Kugel entfernt ist, desto stärker
ist das Gitter gekrümmt (wird im Vertex-Shader erledigt).
Wenn ich mich um den Planeten herum bewege wird das Gitter mitbewegt. Dazu wird eine Rotationsmatrix berechnet welche das Gitter auf den Schnittpunkt zwischen Kamera Achse und Planeten ausrichtet.
(Das sieht ungefähr so aus)

Matrixberechnung:

C-/C++-Quelltext

1
2
3
4
5
    DRVector3 rotation_ZAxis = cameraIntersectionPlanet.normalize();
    DRVector3 rotation_XAxis = camera.getYAxis().cross(rotation_ZAxis).normalize();
    DRVector3 rotation_YAxis = rotation_ZAxis.cross(rotation_XAxis).normalize();
    DRMatrix rotationMatrix = DRMatrix::axis(rotation_XAxis, rotation_YAxis, rotation_ZAxis).invert();
    glMultMatrixf(rotationMatrix);


Um die Textur für diese Position zu berechnen wird ebenfalls diese Matrix verwendet.
Die Textur wird mit einem umfangreichen Perlin Noise Algorithmus im Shader berechnet. Er ist so umfangreich das
ich ihn auf den meisten Computer nicht in jedem Frame in hoher Auflösung neuberechnen kann.
Daher werde ich nur den Teil neuberechnen der neu dazu kommt.
Ich verwende OpenGL FrameBuffer um die Daten mittels eines Pixelshaders in eine Textur rendern zu können.
Das generieren der gesamten Textur dauert also einige Frames. Die Textur wird mit der Rotationsmatrix berechnet,
die aktuell war beim Start.
Wenn ich mich nun weiter um den Planeten bewege, ändert sich die Rotationsmatrix. Um diese Differenz muss ich jetzt die noch unfertige Textur
verschieben, damit der Spieler den richtigen Ausschnitt des Planeten sieht.

Wenn ihr Ideen dazu habt, Anregungen, Tutorials würde ich mich sehr freuen.

Alles Liebe,
das programmierende Einhorn ;)
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

2

17.01.2012, 11:06

Nun, ob der ganze Rest wirklcih die beste Lösung ist, kann ich beim überfliegen nicht beurteilen, aber das eigentliche Problem sollte einfach sein.

Sagen wir du hast einen Drehwinkel a und einen Drehwinkel b. Dann würdest du ja jetzt um die Differenz drehen wollen, also b-a.
Mit Matrizen geht das analog: Du multiplizierst die zweite Matrix B mit der inversen der ersten Matrix A. Sozusagen wird das drehen um a rückgängig gemacht und dann um b gedreht, so kommt man dann insgesamt von a nach b.
Also irgendwie A^(-1)*B
Lieber dumm fragen, als dumm bleiben!

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

17.01.2012, 11:33

Wrap deine Matrizen in eine Klasse, die die Matrix und die Rotationen der drei achsen beinhaltet. Dann überlade den Operator für Subtraktion, der dir die differenz ausrechnet:

Code

so in etwa ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TrommlBomml« (17.01.2012, 11:39)


DarioFrodo

Treue Seele

  • »DarioFrodo« ist der Autor dieses Themas

Beiträge: 349

Wohnort: Kerkau, 100km nördlich von Magdeburg

Beruf: Selbstständig

  • Private Nachricht senden

4

26.01.2012, 12:31

@Jonathan_Klein: du hast recht, so funktioniert es nicht. Die Rotationsmatrix rotiert meinen Körper nicht korrekt.

@TrommlBomml: Hast du eine Idee wie ich die Rotation um die Achsen berechnen könnte?
Mein Ansatz führt dazu, das sich die Geometrie um seine lokale Z-Achse dreht, wenn ich mit der Kamera mich der y-Achse nähre.
Das hat zur Folge das die ganze Textur verdreht wird.
Ich habe versucht die einzelnen Winkel zu berechnen, um den ich die Geometrie rotieren müsste, doch das hat immer
zu fehlerhaften Ergebnissen geführt. Solange ich mich nur um die y oder x-Achse bewege funktioniert es, aber sobald ich die Kamera
um beide Achsen bewege, verdreht sich die Geometrie und damit auch die Textur.

Ich habe erst eine Formel gefunden, mit der ich Kartesische Koordinaten in Sphärische umwandeln kann und zurück, sodass das
Ergebnis wieder dem Ausgangswert entspricht. Ich dachte mir, ich wandle sowohl den Schnittpunkt zwischen Kameraachse und dem Planeten als auch den zu rendernden Vertex auf dem Planeten in Sphärische Koordinaten um und kann dann den Vertex um den Kameraachsenschnittpunkt rotieren.
Aber das funktioniert nicht.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
DRVector3 targetPoint;
DRVector2 spherical;
spherical.u = atan2f(targetPoint.z, targetPoint.x);
spherical.v = acosf(targetPoint.y);
       
DRVector3 transCoord;
transCoord.x = cosf(spherical.u)*sinf(spherical.v);
transCoord.z = sinf(spherical.u)*sinf(spherical.v);
transCoord.y =                cosf(spherical.v);

targetPoint == transCoord

Das hin und her wandeln funktioniert. Wenn ich aber nun auf die spherical koordinaten des Vertex, die der Kamera aufaddiere, dann gibt es eine sehr merkwürdige Form.
So ungefähr:

(Link)
Erst wenn der letzte Fluss vergiftet,
der letzte Baum gefällt,
der letzte Fisch gefangen,
dann werdet ihr merken, dass man Geld nicht essen kann

Man verkauft die Erde nicht, auf der die Menschen wandeln.

- Indianerweisheiten

Ich bin auch ein einhornimmond ;)

Werbeanzeige

Ähnliche Themen