Hello Guest

# Problem with rotation matrix

• 2 Replies
• 6079 Views

#### jacekcichy

• 21
##### Problem with rotation matrix
« on: December 06, 2009, 22:39:07 »
Hi again!

Last time I was trying to rotate my ship by local coordinate system. So after rotation I was reading each rotation matrix and multiply (axis)vectors by them and results put to glRotatef function. Program works but rotations not... ship rotations is very strange... I don't know what is wrong in my idea so please help me

Init code:
Code: [Select]
`static Vector4f zaxis = new Vector4f(0,0,1,1);         static Vector4f yaxis = new Vector4f(0,1,0,1);         static FloatBuffer macierzz = BufferUtils.createFloatBuffer(64);         static FloatBuffer macierzy = BufferUtils.createFloatBuffer(64);        //nowe wektory static Vector4f zaxisd = new Vector4f(); static Vector4f yaxisd = new Vector4f(); //macierze static Matrix4f zm = new Matrix4f(); static Matrix4f ym = new Matrix4f();`Loop code:
Code: [Select]
`                         GL11.glPushMatrix(); GL11.glRotatef(shipzrot,zaxis.getX(),zaxis.getY(),zaxis.getZ()); macierzz.clear(); GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, macierzz); macierzz.rewind(); zm.load(macierzz); zm.transpose(); Matrix4f.transform(zm, zaxis, zaxisd); Matrix4f.transform(zm, yaxis, yaxisd); GL11.glRotatef(shipyrot,yaxisd.getX(),yaxisd.getY(),yaxisd.getZ()); macierzy.clear(); GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, macierzy); macierzy.rewind(); ym.load(macierzy); ym.transpose(); Matrix4f.transform(ym, zaxisd, zaxis); Matrix4f.transform(ym, yaxisd, yaxis); GL11.glCallList(ship.getWskaznik()); GL11.glPopMatrix();`

#### dronus

• 36
##### Re: Problem with rotation matrix
« Reply #1 on: December 18, 2009, 11:37:53 »

GL's  MODELVIEW_MATRIX is relative to the viewer, so it changes if the viewpoint changes, which is usually not useful! If you read it back, you got your ships transform relative to the camera, but not to your "space".

It would be quite cleaner if you manage your ship's transforms inside a Matrix4f only and apply it as whole with GL11.glLoadMatrix. Somewhat like

Code: [Select]
`Matrix4f transformMatrix=new Matrix4f(); ...GL11.glPushMatrix();---now update transformMatrix with your ship controlstransformMatrix.store(matrixBuffer);matrixBuffer.flip();GL11.glMultMatrix(matrixBuffer);---draw the shipGL11.glPopMatrix();`

#### jacekcichy

• 21
##### Re: Problem with rotation matrix
« Reply #2 on: December 18, 2009, 22:32:30 »
Thanks
I resolved it about two days ago. Here is code without using Matrix4f:

Code: [Select]
`private static void run(){ int licz=0; //petla gry while (gameRunning) {          long a = System.currentTimeMillis();          // wywoluj funkcje gamelogic          GameLogic();             // czyscimy obraz i Depth Buffer GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);          GL11.glMatrixMode(GL11.GL_MODELVIEW); GL11.glLoadIdentity(); cam.trans1(RotZ, RotY, PozY); cam.update();                       if (licz != 0){ GL11.glLoadMatrix(m); } GL11.glPushMatrix(); GL11.glRotatef(shipyrot, 0, 1, 0);     GL11.glRotatef(shipzrot, 0, 0, 1);            GL11.glRotatef(shipxrot, 1, 0, 0);            GL11.glTranslatef(0, 0, shipx);                GL11.glGetFloat(GL11.GL_MODELVIEW_MATRIX, m);     GL11.glCallList(ship.getWskaznik()); GL11.glPopMatrix(); licz += 1;                                   // now tell the screen to update Display.update();            // sprawdzamy czy uzytkownik niechce wyjsc, jezeli tak to wychodzimy z petli            if (Display.isCloseRequested()) {     gameRunning = false;            Display.destroy();            System.exit(0);     }     long b = System.currentTimeMillis();     time = (int) (b-a);     }         }`