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

IchMagSpiele

Frischling

  • »IchMagSpiele« ist der Autor dieses Themas

Beiträge: 2

Beruf: Softwarearchitekt / Entwicklungsleitung

  • Private Nachricht senden

1

20.02.2022, 10:32

Probleme beim Verständnis davon, wie die Kamera im 3D Raum gedreht werden kann, wenn die Drehung nicht direkt an den Achsen der Szene ausgerichtet ist

Hallo Zusammen,

um etwas Abwechslung zur Entwicklung im Arbeitsalltag zu erhalten, habe ich mich dazu entschieden etwas farbenfroheres als CLIs zu entwickeln.
Meine Wahl viel, weniger aus dem Interesse an Spielen an sich, eher aus dem Interesse an der Konzeption und Gestaltung von Spielen, drauf eine 3D Spiele Engine zu entwickeln.

Der Weg ist hier das Ziel. Ich habe kein konkretes Spiel das ich umsetzen möchte.

Bevor ich meinen g++ auspacke, habe ich mich dazu entschieden, aufgrund früherer Erfahrungen mit WebGL und der Visualisierung von Graphen im 2D Raum sowie das im rendern von Dokumenten im 2D Raum, erst einmal einen Prototypen mit grundlegender Funktionalität in TypeScript und mit WebGL zu entwickeln.

Fürs Erste hat alles gut geklappt, ich kann nun (siehe Screenshot 1) Meshs (obj wavefront) importieren und rendern. Die Objekte mit einer dedizierten Lichtquelle und einem globalen Licht beleuchten.
Objekte rotieren, transformieren, etc.

Im nächsten Schritt möchte ich die Kamera nicht mehr via Eingabe von spezifischen Werten bewegen, sondern via Maus / Controller. Das Klappt auch Prinzipiell.

Ich kann die Kamera bzw. den Raum jedoch nicht so bewegen wie ich das gerne möchte.
Weder im Forum noch sonst im Netz habe ich eine Lösung gefunden, was ich letztendlich darauf zurückführe, dass ich das ein oder andere Konzept im Zusammenhang mit der Kamera nicht verstanden habe und daher auch die falschen Suchbegriffe verwende.

Bei einer Bewegung der Maus auf der X-Achse möchte ich, dass sich die Szene um die Y-Achse bewegt. Klappt.
(siehe Screenshot 2)

Bei einer Bewegung der Maus auf der Y-Achse möchte ich, dass sich die Szene auf der X-Achse parallel zum Monitor bewegt. Klappt nicht.
(siehe Screenshot 3)

(Ähnlich wie bei Blender)

Ich nutze für die Matratzen https://www.npmjs.com/package/gl-matrix

Die Drehung auf der Y-Achse klappt einfach.

Quellcode

1
mat4.rotateY(this.viewMatrix, this.viewMatrix, radX); 



Klar, die Szene wird ja einfach um die Y-Achse der viewMatrix gedreht.

Die Drehung zur (X) Achse des Monitors gestaltet sich für mich hier aber als schwierig, da ich die Szene jetzt nicht einfach via rotateX drehen kann. Die X-Achse der Szene entspricht ja nicht der des Monitors.

Auszug aus dem Shader.

Quellcode

1
 gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);


Könnt Ihr mir dabei weiter helfen?

Vielen Dank :)


Screenshot 1

(Link)


Screenshot 2

(Link)


Screenshot 3

(Link)

Jonathan

Community-Fossil

  • Private Nachricht senden

2

20.02.2022, 11:03

Womit berechnest du die Kamera-Matrix aktuell? Ich mag eigentlich lookAt(out, eye, center, up), weil man da einfach 2 Punkte angeben kann von wo nach wo man schaut. Wenn sich die Kamera um das Objekt drehen soll, würde center vermutlich die Mitte der Bounding-Box sein. Eye kannst du zwar prinzipiell auch per Rotationsmatrix berechnen, aber für sowas benutze ich auch schonmal ganz gerne explizit sinus/cosinus um die Vektorkomponenten einzeln zu berechnen. Dafür musst du aus Azimuth und Altitude die Position auf der Kugel (wo der Radius dein Sichtabstand ist) berechnen. Du würdest dann bei X-Bewegung der Maus den Azimuth und bei der Y-Bewegung den Altitude Winkel verändern.

Das Hauptproblem bei so Transformationen ist aber, dass es kein richtig oder falsch gibt, sondern eher nützlich und weniger nützlich. Zu erklären, was genau man erreichen möchte ist eigentlich fast schon so schwer wie es richtig einzubauen, aber bevor man nicht genau weiß, was man möchte, ist es auch schwierig zu fragen, wie man das hinbekommt.
Lieber dumm fragen, als dumm bleiben!

IchMagSpiele

Frischling

  • »IchMagSpiele« ist der Autor dieses Themas

Beiträge: 2

Beruf: Softwarearchitekt / Entwicklungsleitung

  • Private Nachricht senden

3

20.02.2022, 11:58

Hallo Jonathan,


Vielen Dank für deine schnelle Antwort.

Ich nutze in der Tat lookAt in der Initialisierung und da ich bei meinem aktuellen Anliegen rotiere, bin ich gar nicht auf die Idee gekommen lookAt auch hier zu verwenden.

Aber klar, lookAt kann hier natürlich alles einfacher machen.



Viele Grüße und vielen Dank

Werbeanzeige