Кватернионы и рисование с помощью glMultMatrix (OpenGL) - PullRequest
0 голосов
/ 19 ноября 2011

У меня снова проблема. Уже пару дней я пытаюсь написать камеру на Java без блокировки карданного подвеса. Для решения этой проблемы я стараюсь использовать Quaternions и glMultMatrix из OpenGL. Я также использую библиотеку "LWJGL", особенно классы Matrix4f , Vector4f и Quaternions. Вот код, который вычисляет кватернионы:

        int DX = Mouse.getDX(); //delta-mouse-movement
        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);

И с помощью этого я превращаю кватернион в матрицу:

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;
}

Преобразованный кватернион выглядит, например, так:

-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

После этого я рисую сцену с этим кодом:

    java.nio.FloatBuffer fb = BufferUtils.createFloatBuffer(32);
    quatToMatrix(camera).store(fb);
    GL11.glMultMatrix(fb);

    drawPlayer();

Моя проблема сейчас в том, что камера, возможно, не двигается или движется недостаточно, потому что я вижу только модель своего игрока и ничего больше (в сцене также есть другой куб, который я рисую после модели игрока).

Я не знаю, что именно не так. Это рисунок, вращение или преобразование? Пожалуйста, помогите мне.

EDIT:

это моя инициализация OpenGL:

GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity(); 
GLU.gluPerspective(45.0f, ((float) setting.displayW() / (float) setting.displayH()), 0.1f,10000.0f); 
GL11.glMatrixMode(GL11.GL_MODELVIEW); 
GL11.glLoadIdentity(); 
GL11.glShadeModel(GL11.GL_SMOOTH); 
GL11.glEnable(GL11.GL_DEPTH_TEST); 
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glHint(GL11.GL_PERSPECTIVE_CORRECTION_HINT, GL11.GL_NICEST); 

Есть идеи, что не так?

1 Ответ

0 голосов
/ 19 ноября 2011

у вас есть некоторые ошибки при перемещении мыши к функции кватерниона (где вы производите кватернион движения X?). Кроме того, нам также необходимо увидеть оставшуюся часть кода настройки вашего чертежа (матрица проекции, инициализация просмотра модели).

...