ich möchte gerne eingelesene .objs um die eigenen Achsen drehen lassen, also in x, y, und z Richtung, aber auf der Stelle.
Dazu habe ich einmal die Mitte der Bounding Box berechnet:
wobei angle[] in 20 Einheiten dekrementiert oder inkrementiert wird, je nach dem in welche Richtung, wobei die drei angle mit 0.0f initialisiert sind
bei hand1.obj funktioniert alles richtig, aber z.B. beim Eifelturm (tour.obj) wird nur korrekt um die y-Achse gedreht, beim Magic Mirror.obj wird um keine Achse korrekt gedreht.
Kann mir jemand erklären, warum?
Außerdem noch eine Frage: Wenn ich die min/max-Werte der Bounding Box habe, wie setzte ich die gluLookAt-Parameter um das entspr. Objekt direkt in der Mitte zu haben?
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wegen gluLookAt.
Du gibst bei dem Befehl 3 Vectoren an:
1. Die Position an der sich die Kamera befinden soll.
2. Die Position zu der die Kamera hingucken soll.
3. Ein Vector der angibt wo "oben" ist.
Ich denke für deine Zwecke solltest du folgende Werte nehmen:
1. Blickpunkt = zentrum deines Modells
2. CamPos = Blickpunk aber um einen beliebigen Wert (z.B. 15) in die Z-Richtung verschoben.
3. UpVector = 0,1,0
Wieso das mit dem Zentrum nicht funktioniert versteh ich nicht. Das Zentrum sollte eigentlich stimmen, wenn du es anhand der Bounding Box berechnest. Wie man richtig dreht (reihenfolge ist wichtig) steht im Tutorial_Matrix2
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Du verwendest des öfteren eine Division mit einem Integer, das solltest du auf Float umstellen, also statt
model->Center.x = model->Min.x + (model->Max.x - model->Min.x) / 2;
besser
model->Center.x = model->Min.x + (model->Max.x - model->Min.x) / 2.0f;
von Lyr: Du verwendest des öfteren eine Division mit einem Integer, das solltest du auf Float umstellen, also statt model->Center.x = model->Min.x + (model->Max.x - model->Min.x) / 2; besser model->Center.x = model->Min.x + (model->Max.x - model->Min.x) / 2.0f;
Dadurch schließt du dann Rundungsfehler aus, was vor allem bei kleineren Modellen zu Problemen führen kann.
Vielen Dank, das waren gute Hinweise, ich habe an anderen Stellen auch evtl. Konvertierungsprobleme gefunden. Leider hat sich das Dehverhalten nicht verändert.
Zitat:
von Flash Wegen gluLookAt. Du gibst bei dem Befehl 3 Vectoren an:
1. Die Position an der sich die Kamera befinden soll. 2. Die Position zu der die Kamera hingucken soll. 3. Ein Vector der angibt wo "oben" ist.
Ich denke für deine Zwecke solltest du folgende Werte nehmen:
1. Blickpunkt = zentrum deines Modells 2. CamPos = Blickpunk aber um einen beliebigen Wert (z.B. 15) in die Z-Richtung verschoben. 3. UpVector = 0,1,0
Jetzt ist die Ausrichtung viel besser! Dankeschön!
Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Beschreib evntl. mal etwas genauer wie du es habe willst und wie es jetzt ist das Drehverhalten. Und zeichne dir auch mal das Model-Center ein, damit du siehst ob daran etwas falsch ist, also entweder die Achsen oder nur den Punkt (wo du dann wahrscheinlich für diesen Punkt den Tiefenbuffer ausschalten müsstest).
Oder ist der Punkt um den herum rotiert wird korrekt nur die Achsen um die gedreht wird falsch? Bei deinem Code ist es klar, dass immer um die aktuelle lokale y und z - Achse des Objektes gedreht wird, nicht um die globalen Achsen.
Hi Lyr,
die Rotation um die 3 Achsen funktioniert nun korrekt. Allerdings kann ich nicht genau sagen, woran es lag, hab rumgefrickelt und plötzlich funktionierte es korrekt.
Ich habe aber noch eine Frage zu deinen Anmerkungen:
Du schreibst, man erkennt an meinem Code, dass ich um die lokalen Achse drehe, nicht um die globalen.
Was bedeutet das? Ich dachte, dass wenn ich die Rotation auf die Modelviewmatrix anwende, ich alles, also global, ändere.
Die zusätzlich eingezeichneten Koordinatenachsen drehen sich nämlich auch mit.
Registriert: So Sep 26, 2004 05:57 Beiträge: 190 Wohnort: Linz
Mit lokaler Drehung meine ich, dass du einfach hintereinander um jede Achse drehst.
Bei
glRotatef(angle[0], 1.0, 0.0, 0.0);
änderst du dein (lokales) Koordinatensystem indem du um die X-Achse drehst. Vor dieser Drehung bist du (von den Drehungen her) noch im globalen Koordinatensytem, wodurch diese Drehung auch korrekt erfolgt (zumindest sollte es so sein :-) ). Bei deinem neuen (lokalen) Koordinatensystem ist nun jedoch die y- und die z- Achse nicht mehr gleich wie beim Globalen.
Das
glRotatef(angle[1], 0.0, 1.0, 0.0);
dreht nun also nicht mehr um die globale y-Achse, sondern um die etwas um die x-Achse rotierte lokale y-Achse. Durch diese Drehung ändert sich wiederum die lokale z-Achse (natürlich auch die x-Achse aber die ist nicht mehr relevant).
Und zum Zeitpunkt von
glRotatef(angle[2], 0.0, 0.0, 1.0);
hat deine aktuelle lokale z-Achse kaum noch etwas mit der globalen z-Achse zu tun, die zeigt nun in irgend eine Richtung.
Eine mögliche Form das zu umgehen wäre wohl, dass du dir eine Quaternion-Klasse zulegst (sollte eh die ein oder andere auch Open Source sein, vielleicht findest sogar eine in einem Tutorial), damit kannst du dann auswählen ob du eine lokale oder eine globale Drehung haben möchtest, sofern du überhaupt globale Drehungen einbauen willst.
Eine andere Möglichkeit wäre, dass du die Matrixmanipulationen händisch durchführst, also die deine Modelview-Matrix entweder merkst oder dir zu dem Zeitpunkt wo du eine Rotation um eine globale Achse durchführen möchtest holst, danach die Mulitplikation mit der entsprechenden Rotationsmatrix entweder Pre oder Post multiplizierst (oder wie das auch immer heißt :-) ), also bei Matrizen macht es ja einen Unterschied ob du schreibst A*B oder B*A. Einmal wird um die globale und einmal um die lokale Achse gedreht.
vielen Dank für deine ausführlichen Erklärungen, jetzt habe ich das mit dem lokalen und globalen Koordinatensystem verstanden.
Ich werde es erstmal beim jetztigen Stand belassen, da freie Bewegungen nicht das Hauptaugenmerk meiner Applikation sein wird.
Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.