Advertisement

Create camera movement 3D

Started by June 14, 2018 11:11 AM
0 comments, last by Inbar_xz 6 years, 6 months ago

I'm using the OPENGL with eclipse+JOGL.
My goal is to create movement of the camera and the player.
I create main class, which create some box in 3D and hold 
an object of PlayerAxis.
I create PlayerAxis class which hold the axis of the player.
If we want to move the camera, then in the main class I call to 
the func "cameraMove"(from PlayerAxis) and it update the player axis.
That's work good.
The problem start if I move the camera on 2 axis, 
for example if I move with the camera right(that's on the y axis)
and then down(on the x axis) -
in some point the move front is not to the front anymore..
In order to move to the front, I do
player.playerMoving(0, 0, 1);
And I learn that in order to keep the front move, 
I need to convert (0, 0, 1) to the player axis, and then add this.
I think I dont do the convert right.. 
I will be glad for help!

Here is part of my PlayerAxis class:

 


//player coordinate
	float x[] = new float[3];
	float y[] = new float[3];
	float z[] = new float[3];
 
 
public PlayerAxis(float move_step, float angle_move) {
		x[0] = 1;
		y[1] = 1;
		z[2] = -1;
		step = move_step;
		angle = angle_move;
		setTransMatrix();
	}
 
 
 
public void cameraMoving(float angle_step, String axis) {
 
        float[] new_x = x;
        float[] new_y = y;
        float[] new_z = z;
        float alfa = angle_step * angle;
 
        switch(axis) {
        case "x":
            new_z = addVectors(multScalar(z, COS(alfa)), multScalar(y, SIN(alfa)));
            new_y = subVectors(multScalar(y, COS(alfa)), multScalar(z, SIN(alfa)));
            break;
        case "y":
            new_x = addVectors(multScalar(x, COS(alfa)), multScalar(z, SIN(alfa)));
            new_z = subVectors(multScalar(z, COS(alfa)), multScalar(x, SIN(alfa)));
            break;
        case "z":
            new_x = addVectors(multScalar(x, COS(alfa)), multScalar(y, SIN(alfa)));
            new_y = subVectors(multScalar(y, COS(alfa)), multScalar(x, SIN(alfa)));
        }
 
        x = new_x;
        y = new_y;
        z = new_z;
        normalization();
 
    }
 
 
public void playerMoving(float x_move, float y_move, float z_move) {
		float[] move = new float[3];
		move[0] = x_move;
		move[1] = y_move;
		move[2] = z_move;
		setTransMatrix();
		float[] trans_move = transVector(move);
		position[0] = position[0] + step*trans_move[0];
		position[1] = position[1] + step*trans_move[1];
		position[2] = position[2] + step*trans_move[2];
	}
 
 
public void setTransMatrix() {
		for (int i = 0; i < 3; i++) {
			coordiTrans[0][i] = x[i];
			coordiTrans[1][i] = y[i];
			coordiTrans[2][i] = z[i];
		}
	}
 
 
public float[] transVector(float[] v) {
		return multiplyMatrixInVector(coordiTrans, v);
	}

 

and in the main class i have this:

 


public void keyPressed(KeyEvent e) {
 
		if (e.getKeyCode()== KeyEvent.VK_ESCAPE) {
	    	System.exit(0);
 
	    	//player move
		} else if (e.getKeyCode()== KeyEvent.VK_W) {
			//front
			//moveAmount[2] += -0.1f;
			player.playerMoving(0, 0, 1);
		} else if (e.getKeyCode()== KeyEvent.VK_S) {
			//back
			//moveAmount[2] += 0.1f;
			player.playerMoving(0, 0, -1);
		} else if (e.getKeyCode()== KeyEvent.VK_A) {
			//left
			//moveAmount[0] += -0.1f;
			player.playerMoving(-1, 0, 0);
		} else if (e.getKeyCode()== KeyEvent.VK_D) {
			//right
			//moveAmount[0] += 0.1f;
			player.playerMoving(1, 0, 0);
		} else if (e.getKeyCode()== KeyEvent.VK_E) {
			//moveAmount[0] += 0.1f;
			player.playerMoving(0, 1, 0);
		} else if (e.getKeyCode()== KeyEvent.VK_Q) {
			//moveAmount[0] += 0.1f;
			player.playerMoving(0, -1, 0);
 
 
			//camera move
		} else if (e.getKeyCode()== KeyEvent.VK_I) {
			//up
			player.cameraMoving(1, "x");
		} else if (e.getKeyCode()== KeyEvent.VK_K) {
			//down
			player.cameraMoving(-1, "x");
		} else if (e.getKeyCode()== KeyEvent.VK_L) {
			//right
			player.cameraMoving(-1, "y");
		} else if (e.getKeyCode()== KeyEvent.VK_J) {
			//left
			player.cameraMoving(1, "y");
		} else if (e.getKeyCode()== KeyEvent.VK_O) {
			//right round
			player.cameraMoving(-1, "z");
		} else if (e.getKeyCode()== KeyEvent.VK_U) {
			//left round
			player.cameraMoving(1, "z");
		}
    }

 

finallt found it.... i confused with the transformation matrix row and col. thanks anyway!

This topic is closed to new replies.

Advertisement