*
Ich grab den thread jetzt nochmal aus, weil ichs immer noch nicht richtig hinbekommen hab.
Ich habe mit gluLookAt einiges probiert, aber es hat nur probleme gemacht, deswegen habe ich es wieder auf glRotatef umgestellt, was einigermaßen funktioniert, aber noch ein paar Probleme bereitet.
Folgendes Problem:
Drehe ich nach starten des Programms um 180 grad nach rechts, klappt das super.
Drehe ich nach starten des Programms aber erst um 180 "in den Bildschirm rein" und dann 180 grad nach rechts, dann dreht sich der würfel nach links statt nach rechts.
Ich sehe dafür 2 Mögliche Ursachen:
1.
void CubeWidget::AdjustCamera()
{
glLoadIdentity();
float scaleFac = 1.f/radius;
glScalef(scaleFac, scaleFac * float(width()) / height(), scaleFac);
glRotatef(theta, 1, 0, 0);
glRotatef(phi, 0, 1, 0);
}
Es wird erst um die eine Achse gedreht und dann um die andere Achse, wodurch die 2. Drehung durch die 1. beeinflusst wird.
void CubeWidget::ChangePhi(float delta)
{
phi += delta;
update();
}
void CubeWidget::ChangeTheta(float delta)
{
theta += delta;
update();
}
Bei mausbewegungen/tastendrücken addiere ich einfach auf die Winkel drauf, ohne die aktuelle Kameraposition zu beachten. Wenn die Kamera "auf dem Kopf" steht müsste der Winkel sich aber anders ändern, als wenn sie normal ist (siehe Problem ganz oben).
Ich bin mir nicht ganz sicher, ob beide Möglichkeiten relevant sind, oder ob es nur eins von beidem ist.
Zur Lösung von 1. müsste ich irgendwie beide Drehungen zusammenfassen, so dass ich sie durch eine Drehung ersetzen kann.
Zur Lösung von 2. müsste ich die Winkel basierend auf der aktuellen Kameralage anpassen.
Bei beiden Problemen kann man sicher irgendwie mit den trigonometrischen Funktionen arbeiten, aber wie genau habe ich noch nicht rausgefunden. Alternativ könnten Drehmatrizen helfen, ich könnte mir z.B. vorstellen, dass ich die erste Drehung durchführe und die Drehmatrix für die zweite Drehung vor Anwendung mit der inversen der aktuellen Matrix multipliziere.
Allerdings kompliziert die Verwendung solcher Matrizen alles etwas.
Habt ihr ideen, wie ich das lösen kann?