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

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

1

12.09.2010, 11:55

Lokales Koordinatensystem

Hallo,
Ich habe leider noch ein paar Probleme mit der Trennung von globalem und lokalem Koordinatensystem, vor allem aber deren Implementierung (OpenGL).

Ich habe es bis jetzt so verstanden, dass man lokale Koordinatensysteme verwendet aus zwei Gründen:
1. Um Rotationen "um die eigene Achse" ohne Translation in den Urspung und zurück machen zu können
2. Wenn man sehr oft das selbe Objekt hat, was sich aber nur durch Skalierung/Rotation/Position untereinander unterscheidet.

Gibt es noch andere Gründe?

Desweiteren Frage ich mich, wie genau man (mit OpenGL) sowas implementiert. Sagen wir mal, wir haben eine Klasse Sphere, deren c'tor am Anfang eine Einheitskugel mit Normalen etc erstellt. Davon soll es später sehr viele geben und sie sollen sowohl um den Ursprung (global) rotieren können (also in der Art Translation->Rotation, was ja dann eine Art Kreisbahn beschreibt), als auch um sich selbst. Also als Beispiel eine Art Sonnensystem. Wie würde man sowas jetzt genau realisieren, damit beide "Arten" von Rotationen leicht machbar sind?

Ihr könnt am besten jetzt schon antworten, es folgen noch ein paar chaotische Fragen, weil ich eben vieles noch nicht ganz durchschaut habe... ^^

In OpenGL gibts soweit ich weiß für diese lokalen Koordinatensysteme diese Modelview Matrix, d.h. man speichert dann wohl wirklich ein richtiges Koordinatensystem mit 3 Vektoren, auf dem man dann operiert? Vor allem Frage ich mich jetzt aber, wie man wohl am besten eine Translation macht. Macht eine Translation im lokalen Koordinatensystem überhaupt Sinn? Geht das überhaupt? Würde man da jetzt die Modelviewmatrix (?=lok. KoordSys?) irgendwie verändern oder müsste man die Vertices direkt verschieben/verändern? Gibt es eine Möglichkeit das ganze so zu machen, dass man garnicht mehr die einzelnen Vertices für jedes Objekt speichern müsste, also praktisch immer von der "Ursprungstopologie", z.B. Einheitskugel ausgeht (z.B. die Position des lok. KS im globalen speichern?)?

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

2

12.09.2010, 20:36

Hhmmm, sry für den Doppelpost, aber ich versteh nicht so ganz warum mir keiner antwortet... hab ich was falsches gesagt? :S ;(

Eigentlich dachte ich, handelt es sich hier doch um was recht elementares ^^ ist vielleicht OpenGL das problem? Dann denkt euch einfach ich hätte nix von OpenGL gesagt und erklärt es mir einfach generell... büdde :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

12.09.2010, 20:59

Du siehst das viel zu sehr fokusiert auf die einzelnen Bezeichnungen. Im Endeffekt ist es ganz egal wie viel "Koordinatensysteme" du verwendest. Du drückst damit nur ein und denselben Punkt in Relation zum verwendeten Koordinatensystem aus.

Im Allgemeinen verwendet man eine handvoll Koordinatensysteme, weil sich das Vorgehen als praktisch erwießen hat. Die Modeldaten werden i.A. im (Model-)lokalen Koordinatensystem geliefert. Dann wird das Model in die virtuelle Welt gesetzt (ins Weltkoordinatensystem, oder Globaleskoordinatensystem transformiert). Anschliessend durchlaufen die Modeldaten (3D Positionen) noch diverse weitere Räume bis sie auf dem Bildschirm landen.

Der Grund warum man diese Unterscheidungen trifft ist: es ist praktisch. Zum Teil kann man Operationen so wesentlich vereinfachen (z.B. beim Normalmapping im Tangentspace usw...).

In OpenGL ist die vorgehensweise folgendermassen:

Modelspace -> Viewspace -> Clipspace -> Devicespace

OpenGL fasst die Transformation vom Model- (über Word-) zum Viewspace in einen Schritt zusammen (Modelviewmatrix). Bezüglich deinem Beispiel mit der Kugel: Dafür sind drei Schritte notwendig (die sich in einen Schritt vereinen lassen, durch Multiplikation der Transformationsmatrizen). Zuerst drehen der Kugel, dann verschieben, dann nochmals drehen. Das machst du für jedes Objekt gesondert, d.h. du setzt die Modelviewmatrix immer auf einen definierten Wert zurück (im alten Standard gabs dafür den Matrixstack).
@D13_Dreinig

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

4

12.09.2010, 21:31

Danke schonmal für die Erklärungen.

Allerdings gibt es noch ein paar offene Fragen:
1. Heißt das, dass ich im Grunde genommen wenn ich 1000 Kugeln habe, nicht mehr die Vertices für jede Kugel speichern muss, sondern im Prinzip nur 1 mal (z.B. statisch) und dann einfach immer nur die Transformationsmatrizen miteinander multipliziere und am Ende diese (ist das dann die Modelviewmatrix?) dann OpenGL übergebe, inkl. den Standardvertices?
2. Was ist wenn ich bereits einige Transformationen gemacht habe (u.a. auch mind 1 Translation) und am "Ende" nochmal ein Objekt um die eigene Achse drehen will. Muss ich dann zwangsläufig zuerst wieder zurück in den Ursprung schieben, oder geht es doch noch irgendwie anders? Also z.B. Skalierung/Rotation nur "lokal" machen, und separat speichern, wo sich das lok. KoordSys/Objekt befindet?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

12.09.2010, 21:39

Zu 1: Genau, du kannst ein und dieselben Daten verwenden und verschieden Positionieren.

Zu 2: Ja, allerdings würde ich dann erstmal prüfen ob die Operationen nicht in einer anderen Reihenfolge durchgeführt werden können, die das gleiche Ergebnis liefern.
@D13_Dreinig

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

6

12.09.2010, 22:05

Zu 1: Coole Sache :D
Zu 2: Wieso sollte man das nicht trennen, bringt das irgendwelche Nachteile mit sich?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

12.09.2010, 22:18

Zu 2: Wieso sollte man das nicht trennen, bringt das irgendwelche Nachteile mit sich?


Wieso nicht trennen... Nur ggf umsortieren.
@D13_Dreinig

Werbeanzeige