Camera rotation question

Started by entis, April 16, 2008, 10:58:25 AM

Previous topic - Next topic

entis

Hi,

I have a question about camera rotation... I would like to rotate a camera each time absolutely (i.e. rotation angle should be layed off from the world axis each time I call the rotation method) .. currently I have a problem with it. For example if I call camera.rotateY(Math.toRadians(10)) two times it will do camera rotation each time and the camera angle relative to the world Y axis will be 20 deg. not 10.

Here is what I want:
...
camera.rotateY(Math.toRadians(10)) // camera has been rotated on 10 deg. (relative to the world Y axis)
camera.rotateY(Math.toRadians(10)) // actually camera has been rotated on 10 deg. (relative to the world Y axis) but nothing changed on the screen since angle is 10 again
camera.rotateY(Math.toRadians(12)) // actually camera has been rotated on 12 deg. (relative to the world Y axis) but on the screen it looks like rotation on 2 deg. (relative to the old position)

So your sugestions are welcome about how can I realize this in jpct... may be it's already done in jpct?
Thanks in advance.

EgonOlsen

Just do something like:

camera.getBack().setIdentity();

Before doing the rotations. That should do the trick.

entis

Quote from: EgonOlsen on April 16, 2008, 12:14:34 PM
Just do something like:

camera.getBack().setIdentity();

Before doing the rotations. That should do the trick.

Thanks a lot! it really works...

entis

#3
Hi,

I have another one question about camera rotation/movement...

In my app I move the camera just like in the JPCT FPS example is shown:


   ...
   public void moveIn()
   {
   tempVector = cameraDirection.getZAxis();
   scene.checkCameraCollisionEllipsoid(tempVector, CAMERA_ELLIPSOID_RADIUS, CAMERA_MOVE_SPEED, 5);
   }

   public void moveOut()
   {
   tempVector = cameraDirection.getZAxis();
   tempVector.scalarMul(-1f);
   scene.checkCameraCollisionEllipsoid(tempVector, CAMERA_ELLIPSOID_RADIUS, CAMERA_MOVE_SPEED, 5);
   }

   public void moveUp()
   {
   tempVector = cameraDirection.getYAxis();
   tempVector.scalarMul(-1f);
   scene.checkCameraCollisionEllipsoid(tempVector, CAMERA_ELLIPSOID_RADIUS, CAMERA_MOVE_SPEED, 5);
   }
   
   public void moveDown()
   {
   tempVector = cameraDirection.getYAxis();
   scene.checkCameraCollisionEllipsoid(tempVector, CAMERA_ELLIPSOID_RADIUS, CAMERA_MOVE_SPEED, 5);
   }
   ...


and it works ok... but know I need to call once camera.lookAt() method to point my camera to some object... but after this my camera begin to move not good with the code listed above...
I understand that it's due to the fact that my cameraDirection matrix is not changed with lookAt() method, but I just can't get how to apply modifications made by lookAt() method to the cameraDirection matrix... Please help...

entis

I found some solution here http://www.jpct.net/forum2/index.php/topic,317.0.html but anyway my movement is not parallel to the floor after lookAt()...

paulscode

#5
I am not an expert on this subject, but I believe the reason for movement not being parallel to the floor after lookAt(), is because the camera's Z-axis is changed by that method.  Instead of using the camera's getZAxis() for the moveIn() and moveOut() methods, you will probably need to calculate a vector that is in the general direction of the object, but parallel to the ground (i.e. if the ground is flat and constant altitude, then destination Y should equal camera Y)).  Use that vector in your call to checkCameraCollisionEllipsoid() instead of getZAxis().

Also, if you want the moveUp() and moveDown() methods to move perpendicular to the ground when you "lookAt()" an object with a different Y position than the camera, then instead of using the camera's getYAxis(), you will probably need to calculate a vector that is perpendicular to the ground (i.e. if the ground is flat and constant altitude, then use (0, 1, 0)).

In cases where the ground is not flat and constant altitude, you may be able to assume it is and just let the collision detection take care of the altitude adjustments.  I don't have any experience with collision detection in jPCT yet, though, so you'll have to experiment, and I am sure some other people can help you, who have more experience than I do on the topic.

One more thing, if you are keeping track of a "playerDirection" matrix separate from the camera's direction matrix (as mentioned in the thread you brought up), then what EgonOlsen wrote is what you will need help with:

Quote from: EgonOlsen on November 01, 2005, 08:15:48 AM
... I assume that movement should stay parallel to the floor even when looking slightly up or down to the object in question. Then you have to maintain the player's rotation matrix yourself, i'm afraid ...

Unfortunately, I do not have any experience with that topic, either.

Anyway, I hope this helps you out a little  ;D

entis

Quote from: paulscode on April 28, 2008, 11:34:49 PM
I am not an expert on this subject, but I believe the reason for movement not being parallel to the floor after lookAt(), is because the camera's Z-axis is changed by that method.  Instead of using the camera's getZAxis() for the moveIn() and moveOut() methods, you will probably need to calculate a vector that is in the general direction of the object, but parallel to the ground (i.e. if the ground is flat and constant altitude, then destination Y should equal camera Y)).  Use that vector in your call to checkCameraCollisionEllipsoid() instead of getZAxis().

Also, if you want the moveUp() and moveDown() methods to move perpendicular to the ground when you "lookAt()" an object with a different Y position than the camera, then instead of using the camera's getYAxis(), you will probably need to calculate a vector that is perpendicular to the ground (i.e. if the ground is flat and constant altitude, then use (0, 1, 0)).

In cases where the ground is not flat and constant altitude, you may be able to assume it is and just let the collision detection take care of the altitude adjustments.  I don't have any experience with collision detection in jPCT yet, though, so you'll have to experiment, and I am sure some other people can help you, who have more experience than I do on the topic.

One more thing, if you are keeping track of a "playerDirection" matrix separate from the camera's direction matrix (as mentioned in the thread you brought up), then what EgonOlsen wrote is what you will need help with:

Quote from: EgonOlsen on November 01, 2005, 08:15:48 AM
... I assume that movement should stay parallel to the floor even when looking slightly up or down to the object in question. Then you have to maintain the player's rotation matrix yourself, i'm afraid ...

Unfortunately, I do not have any experience with that topic, either.

Anyway, I hope this helps you out a little  ;D

Thanks Paulscode... the following action after lookAt() method solves all the problems with parallel movement: cameraDirection.set(2,1,0.0f);