PDA

View Full Version : [Frage] Objektkoordinaten ...


bimbo
12-04-2004, 15:52
Meine figur soll um beliebige achsen rotierbar sein, dazu hab ich 3 Richtungen definiert, (v_dir, v_updir, v_strafe) das alles sind normalisierte vektoren, die mir die rotation des objektes angeben. sie repräesentieren die Z-,Y- und X-Achse des Objektkoordinatensystems.
Spieltechnisch funktioniert das auch wunderbar, ich habe aber probleme OpenGL die gewünschten rotationsmatrizen mitzuteilen.
gedacht ist folgendes:
void draw()
{
glPushMatrix();
glTranslatef(posX,posY,posZ);
rotiereObjekt();
my_Model->render();
glPopMatrix();
}
das rotiereObjekt_mit_glRotate_aufrufen(void) hab ich mitlerweile auf 4 verschiedene Arten gemacht, aber keine funktioniert wie gewünscht.
Meine 2 favourites funktionieren so:

//Variante 1
void rotiereObjekt(void)
{
berechne Winkel zwischen v_dir und (0,0,1) // v_dir=Objektkoordinaten Z-Achse
rotAchse = normale von v_dir (0,0,1);
rotiere v_updir und v_strafe um (winkel,rotAchse);
glRotatef(Winkel,rotAchse.x,rotachse.y,rotachse.z) ;
...//und so weiter mit den anderen achsen
}

//Variante 2
void rotiereObjekt(void)
{
Vector a = projeziere v_dir in XZ-Ebene;
cos(A) = a.z;
winkel = Bogenmaß2Grad(cos(A));
glRotatef(winkel,0,1,0);
...//usw.
}
Ist es überhaupt klug, das was ich will so zu machen? welche Varianten gibts noch(ausser mir die drehwinkel immer zu merken)?
ich hock jetzt schon 3 tage vor dem sch* und komm nicht recht weiter.
lg, bimbo.

ChrisChiu
13-04-2004, 00:07
Quaternione wären noch eine Möglichkeit dafür... da gibt's einige Artikel dazu auf www.gamedev.net und www.gamasutra.com

Brauchst du bei deinem Spielprinzip die Rotation des Charakters um die Z-Achse? Sehr oft reicht bei manchen Spielprinzipien eine "limitierte" Rotation (also keine 100% freie) aus. Bei einem First Person Shooter z.B. ist es eher selten dass sich der Charakter um die eigene Z-Achse dreht, da würde es z.B. reichen (wenn man jetzt vektorbasiert arbeiten möchte) view-direction und position zu speichern (und den Up-Vector auf (0, 1, 0) anzunehmen).

Freie Rotationen braucht man meistens nur bei Space-Shooter-artigen Spielen; und da würd ich aufgrund des Gimbal-Lock Problems auf jeden Fall auf Quaternione setzen.

Auch die Euler-Repräsentation (also die Winkel speichern statt der "Vektoren") wäre eine einfacherere Möglichkeit verglichen mit den Vektoren die du speicherst, hier würd man halt unter Umständen das "Gimbal Lock" Problem haben (wo man durch eine bestimmte Reihenfolge an Rotationen dann einen Freiheitsgrad verliert).

Uebungsleitung
14-04-2004, 17:31
Warum so kompliziert?

Wie im Repetitorium erzählt (und wie auch in der Tips und Tricks Seite zu finden!), reicht es doch, die 3 Vektoren, die die Achsen des Koordinatensystems darstellen, direkt mit glMultMatrix (mit 0/1 gepadded als 4x4 Matrix) an OpenGL zu übergeben (eventuell transponiert, wenns die Inverse sein soll)...

Wenn man die 3 Vektoren gleich als Matrix speichert, kann man sie gleich bequem von links (globale Rotation) oder von rechts (lokale Rotation) mit den Rotationsmatrizen für das neue Frame zu multiplizieren...

Am besten diese Quellen nochmal durchlesen..

Michael Wimmer