PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehung mit Quaternion?


Ganon
2012-09-09, 10:04:59
Heyho.

Jedes Tutorial im Netz ist anders, und irgendwie kriege ich es mit keinem oder einem Schnitt von allen nicht hin xD Darum frag ich mal hier...

Es geht am Anfang erst mal um eine First Person Camera. Ich nutze zur Darstellung erst mal OpenGL und als Mathe-Bibliothek GLM.

Ich habe eine für die Kamera z.B. folgende Werte:

pos = (0,0,5)
direction = -pos // gucke zum Zentrum
up = (0,1,0)

Diese übergebe ich dann ans Frustum für's Frustum Culling und für das LookAt(pos, pos+direction, up).

Als Input bekomme ich von der Maus jetzt die relativen x,y Werte, seit der letzten Bewegung. Also den 2D-Vektor wohin ich drehen will. Jetzt würde ich gerne den direction-Vektor in die Richtung des Maus-Vektors drehen. Eben wie man sich so eine FPS-Kamera so vorstellt.

Aber wie mache ich das genau, wenn man das denn überhaupt so macht. Bin gerade was das anbelangt so verwirrt... xD

Habe halt die Funktionen von:
http://glm.g-truc.net/api/a00195.html und http://glm.g-truc.net/api/a00149.html

Hatte halt mal "stumpf" sowas probiert, aus einem der Tutorials, aber das klappt "überraschenderweise" nicht... :


void HandleMouseMotion(glm::vec2 &dir) {
glm::quat orientation;
glm::quat r1 = glm::angleAxis(dir.x, 0.0f,1.0f,0.0f);
glm::quat r2 = glm::angleAxis(dir.y, 1.0f,0.0f,0.0f);

orientation = r1 * r2;

direction = orientation * direction;
}


Hat jemand vllt. einen Tipp dazu?

Ganon
2012-09-09, 13:02:16
Hmm, bin schon weiter gekommen:



glm::quat orientation;

if(dir.x != 0.0f) {
glm::quat r1 = glm::angleAxis(dir.x, 0.0f,1.0f,0.0f);
orientation = orientation * r1;
}
if(dir.y != 0.0f) {
glm::quat r2 = glm::angleAxis(-dir.y, 1.0f,0.0f,0.0f);
orientation = r2 * orientation;
}

orientation = glm::normalize(orientation);

direction = orientation * direction;


In einem Sichtbereich "umgucken" geht, aber ich kann mich momentan noch nicht um die eigene Achse drehen...

Marscel
2012-09-09, 16:05:31
Ist lange her, dass ich sowas mal gebaut habe. Idee nur so aus der Hüfte:

* du nimmst direction und drehst in einmel auf der x-z-Ebene um die x-Komponente des Mausvektors, und einmal auf der y-z-Ebene um die y-Komponente
* vielleicht etwas herumprobieren, wie sehr der Mausvektor skaliert werden soll, damit die Mausbewegung der Kameradrehung deinen Wünschen entspricht, also die Empfindlichkeit
* nach der Drehnung verschiebst du den gedrehten direction Vektor zurück an die Kamera, also direction = direction + pos

Gast
2012-09-09, 16:31:03
void Camera::rotate(float angle, Vec3 axis)
{
Quat rot(axis, angle * 3.141f / 180.0f);
Quat view(0.0f, direction.x, direction.y, direction.z);

Quat updated = ((rot * view) * rot.conjugated());

direction.x = updated.b;
direction.y = updated.c;
direction.z = updated.d;
}