Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 2 of 2

Thread: Matrix transformations for trackball rotation OpenGL (LWJGL)

  1. #1
    Junior Member Newbie
    Join Date
    Aug 2012
    Posts
    5

    Matrix transformations for trackball rotation OpenGL (LWJGL)

    Hi,

    I have some code to implement a trackball which I've adapted from an OpenGL ES Android
    example online. It works fine on Android, I want to use this same method in the desktop
    version of my program which uses OpenGL (LWJGL), but for some reason the code is
    not working...The model rotates but in a random, chaotic manner....

    Because OpenGL-ES on android has the Matrix class with native bindings, I've had to merely
    change the matrixes from float[16] (android) to Matrix4f (LWJGL), but it's not working
    as expected!


    IN MOUSE MOVE EVENT
    DeltaX and DeltaY set appropriately

    ON INITIALISATION

    mAccumulatedMatrix.setIdentity();


    AFTER SETTING UP SCENE

    // ----------------------------------------------------------------------------------------------
    // Trackball Rotation matrix code from:
    // http://www.learnopengles.com/rotatin...-touch-events/

    // Set a matrix that contains the current rotation.
    mCurrentRotation.setIdentity();
    Matrix4f.rotate(DeltaX, new Vector3f(0f,1f,0), mCurrentRotation, mCurrentRotation);
    Matrix4f.rotate(DeltaY, new Vector3f(1f,0f,0), mCurrentRotation, mCurrentRotation);
    DeltaX = 0.0f;
    DeltaY = 0.0f;

    // Multiply the current rotation by the accumulated rotation, and then set the accumulated
    // rotation to the result.
    Matrix4f.mul(mCurrentRotation, mAccumulatedRotation, mTemporaryMatrix);
    Matrix4f.load(mTemporaryMatrix, mAccumulatedRotation);

    FloatBuffer matrixBuff = BufferUtils.createFloatBuffer(16);
    mAccumulatedRotation.store(matrixBuff);
    matrixBuff.flip();
    GL11.glMultMatrix(matrixBuff);

    DRAW_THE_MODEL();

    // End Trackball code ---------------------------------------------------------------------------



    THE ORIGINAL OPENGL ES 1.0 ANDROID CODE (WORKS FINE) IS BELOW:

    ----------------------------------------------------------------------------------------------
    // Trackball Rotation matrix code from:
    // http://www.learnopengles.com/rotatin...-touch-events/

    // Set a matrix that contains the current rotation.
    Matrix.setIdentityM(mCurrentRotation, 0);
    Matrix.rotateM(mCurrentRotation, 0, DeltaX, 0.0f, 1.0f, 0.0f);
    Matrix.rotateM(mCurrentRotation, 0, DeltaY, 1.0f, 0.0f, 0.0f);
    DeltaX = 0.0f;
    DeltaY = 0.0f;

    // Multiply the current rotation by the accumulated rotation, and then set the accumulated
    // rotation to the result.
    Matrix.multiplyMM(mTemporaryMatrix, 0, mCurrentRotation, 0, mAccumulatedRotation, 0);
    System.arraycopy(mTemporaryMatrix, 0, mAccumulatedRotation, 0, 16);

    // Rotate the cube taking the overall rotation into account.
    Matrix.multiplyMM(mTemporaryMatrix, 0, mModelMatrix, 0, mAccumulatedRotation, 0);
    System.arraycopy(mTemporaryMatrix, 0, mModelMatrix, 0, 16);

    gl.glMultMatrixf(mAccumulatedRotation, 0);

    DRAW_THE_MODEL();
    // End Trackball code

    ---------------------------------------------------------------------------

    Jamie

  2. #2
    Junior Member Newbie
    Join Date
    Dec 2013
    Posts
    25
    I'm no expert here, and I'm not familiar enough with these libraries to say anything for certain, but could it be that one uses degrees while the other uses radians?

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •