Hallo Leute,
Ich versuche schon seit einer weile verzweifelt eine Kamera ohne gimbal lock zu schreiben, doch irgentwie klappt es nie. Vielleicht könnt ihr mir helfen.
Zur realisierung verwende ich die vorgefertigten classen Matrix4f, Vector4f und Quaternionen von LWJGL.
Mit folgendem Code berechne ich aus der Mausebewegung seit dem letzen Aufruf die Rotation.
Stimmt das soweit?
Danach konvertiere ich das daraus resultierende Quaternion zu einer Matrix, mit folgendem Code:
Wenn ich die Matrix ausgeben lasse, bekomme ich z.B. soetwas:
zum Schluss mutlipliziere ich die aktuelle viewMatrix mit der Matrix des Quaternion.
Mit meinem Code bekomme ich leider nur ein Schwarzes Bild. Wo könnte der Fehler stecken?
Zu Beginn dachte ich, ich würde nur in eine Richtung schaun, in der nichts ist, aber ein Würfel welchen ich um den Nullpunkt gelegt habe und man eigentlich sehen müsste, sehe ich auch nicht (es geht erst wieder, wenn ich loadIdentity mache, aber des könnt ihr euch ja sicher denken^^).
Ich hoffe ihr könnt mir helfen, dieses Problem bringt mich noch zur Verzweiflung.
Danke schonmal!
Gruß,
Mick
Ich versuche schon seit einer weile verzweifelt eine Kamera ohne gimbal lock zu schreiben, doch irgentwie klappt es nie. Vielleicht könnt ihr mir helfen.
Zur realisierung verwende ich die vorgefertigten classen Matrix4f, Vector4f und Quaternionen von LWJGL.
Mit folgendem Code berechne ich aus der Mausebewegung seit dem letzen Aufruf die Rotation.
Stimmt das soweit?
Java:
int DX = Mouse.getDX(); //delta Maus Bewegung
int DY = Mouse.getDY();
Vector4f axisY = new Vector4f();
axisY.set(0, 1, 0,DY);
Vector4f axisX = new Vector4f();
axisX.set(1, 0, 0, DX);
Quaternion q1 = new Quaternion();
q1.setFromAxisAngle(axisX);
Quaternion q2 = new Quaternion();
q2.setFromAxisAngle(axisY);
Quaternion.mul(q1, q2, q1);
Quaternion.mul(camera,q1,camera);
Danach konvertiere ich das daraus resultierende Quaternion zu einer Matrix, mit folgendem Code:
Java:
public Matrix4f quatToMatrix(Quaternion q){
double sqw = q.w*q.w;
double sqx = q.x*q.x;
double sqy = q.y*q.y;
double sqz = q.z*q.z;
Matrix4f m = new Matrix4f();
// invs (inverse square length) is only required if quaternion is not already normalised
double invs = 1 / (sqx + sqy + sqz + sqw);
m.m00 = (float)(( sqx - sqy - sqz + sqw)*invs) ; // since sqw + sqx + sqy + sqz =1/invs*invs
m.m11 = (float)((-sqx + sqy - sqz + sqw)*invs);
m.m22 =(float) ((-sqx - sqy + sqz + sqw)*invs);
double tmp1 = q.x*q.y;
double tmp2 = q.z*q.w;
m.m10 = (float) (2.0 * (tmp1 + tmp2)*invs);
m.m01 = (float) (2.0 * (tmp1 - tmp2)*invs) ;
tmp1 = q.x*q.z;
tmp2 = q.y*q.w;
m.m20 = (float)(2.0 * (tmp1 - tmp2)*invs) ;
m.m02 = (float)(2.0 * (tmp1 + tmp2)*invs) ;
tmp1 = q.y*q.z;
tmp2 = q.x*q.w;
m.m21 = (float)(2.0 * (tmp1 + tmp2)*invs) ;
m.m12 = (float)(2.0 * (tmp1 - tmp2)*invs) ;
return m;
}
Wenn ich die Matrix ausgeben lasse, bekomme ich z.B. soetwas:
-0.5191307 0.027321965 -0.85425806 0.0
0.048408303 -0.9969446 -0.061303165 0.0
-0.8533229 -0.07317754 0.51622194 0.0
0.0 0.0 0.0 1.0
zum Schluss mutlipliziere ich die aktuelle viewMatrix mit der Matrix des Quaternion.
Java:
java.nio.FloatBuffer fb = BufferUtils.createFloatBuffer(32);
quatToMatrix(camera).store(fb);
GL11.glMultMatrix(fb);
Mit meinem Code bekomme ich leider nur ein Schwarzes Bild. Wo könnte der Fehler stecken?
Zu Beginn dachte ich, ich würde nur in eine Richtung schaun, in der nichts ist, aber ein Würfel welchen ich um den Nullpunkt gelegt habe und man eigentlich sehen müsste, sehe ich auch nicht (es geht erst wieder, wenn ich loadIdentity mache, aber des könnt ihr euch ja sicher denken^^).
Ich hoffe ihr könnt mir helfen, dieses Problem bringt mich noch zur Verzweiflung.
Danke schonmal!
Gruß,
Mick
Zuletzt bearbeitet: