[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
I'm implementing a camera system using Euler angles, but I'm not sure
about one thing. Here's a small intro.
The system is simple: I keep track of the camera's local coordinate
system by applying transforms to it's Up, Right and Direction vectors
(all unit vectors) and also it's Target (just a reference point) and
Position. One operation, for instance, is applying yaw, pitch and
rotate, in this order, using the camera's axis as the axis for the
rotation - yaw rotates Right and Direction vectors about the Up vector,
pitch rotates Up and Direction about the Right vector, and so on.
When I'm finished transforming the camera, I call gluLookAt, passing as
arguments the camera's position, up vector and target.
Ok, so this performs as espected, but there's this transform that I
implemented, which goes like this (it's supposed to mimic the behavior
of a FPS camera):
target -= camera position
rotate Right, Direction and Target about Up axis (yaw)
rotate Direction and Target about Right axis (pitch)
recalculate Right as (Direction x Y_axis) or as (Direction x Z_axis),
if lies along the Y axis (BTW, "x" stands for cross product)
recalculate Up as (Right x Direction)
target += camera position
This seems to work fine, but if, for example, I pitch up, and start
just applying yaw repeatedly, I notice that the camera slowly starts
leveling, canceling the initial pitch. Obviously the Up vector is
getting screwed up, but I can't notice why. Or is my approach just wrong
in the first place?
Miguel A. Osorio