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:

// Rotating An Object With Touch Events | Learn OpenGL ES

// 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:

// Rotating An Object With Touch Events | Learn OpenGL ES

// 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