Sign in to follow this  
Sleek Media

Camera Woes

Recommended Posts

Hello. I'm having some issues dealing with cameras in a 3D game world. For our game, the camera has been set up to "target" a single object. That is, it will always perform a 'Look At' function with the target object. The camera has three high-level properties: Distance - the distance from the object's point of origin Height - height above or below the object's point of origin Rotation - rotation around the object's point of origin I've been working on a function which allows the coder to create various camera effects, such as zooming in or out, pulling a 180 around the target, following a special move, and so on. The distance traversed must be defined. So far, I've tried two methods to perform this function. Both work fine until I try to add acceleration and deceleration. I can't figure out how to compensate for the lost distance while accelerating/decelerating. I require the function to allow the following: - input a start/end for distance, height, and rotation - input some measurement for acceleration and deceleration - be able to synchronize completion of movements for all three properties First, I tried to define the movements by Time. The user would define the start and end distances for each of the three properties, as well as the duration of the movement. For acceleration and deceleration, the user would also define that end point of acceleration and the start point of deceleration on a scale of 0.0 - 1.0 (0.0 represents the start, and 1.0 represents the end). The program then calculates the maxspeed to move the camera in order to cover the distance in the set amount of time. This works without acc/dcc, but once those are introduced, the distance lost while accelerating/decelerating adds up. To fix this, I need to calculate a new maxspeed, which would mean that I also have to calculate a new rate of acceleration. This just leads me in circles, and I can't figure out what to do at all. So I tried going by Traversal instead of Time. It completely ignores the time it takes to move a certain distance. Instead, it uses acceleration/deceleration cutoffs and rates for each of the three properties. Somehow, it too is giving me problems. Synchronizing the movement of all three properties has become very difficult, and I have the new problem of trying to ensure that the distance is travelled correctly with acc/dcc. Because the movement relies on a delta time, I cannot calculate the exact distance that will be covered when decelerating, so I can't calculate a deceleration rate that will both be constant and satisfy the full distance. If anyone can help me determine an equation to compensate for the accel/decel losses, I would greatly appreciate it. Thanks.

Share this post


Link to post
Share on other sites
Correct. Each of the three properties has its own acceleration/deceleration rate so that all three properties may start and end simultaneously.

Share this post


Link to post
Share on other sites
Wouldn't it be better to use this:

x + = (target_x - x) / 5
y + = (target_y - y) / 5
z + = (target_z - z) / 5

or is that not what you had in mind, because using the above eliminates the acceleration components, but makes a smooth camera.

Share this post


Link to post
Share on other sites
No, acceleration must be controlled. I also cannot add static values because delta time is not constant.

For example, smooth acceleration looks like this:

// Store the current time (add DT to it)
m_fCurSeqTime += fDT;

// Update the sequence point
m_fCurSeqPoint = m_fCurSeqTime / m_fSeqDuration;

// Acceleration
if((m_fCurSeqPoint <= m_fAccelPoint) && (m_fCurSeqPoint >= 0.0f))
{
// AmountToAdd/Subtract = MaxSpeed * LenAccelInSeqPoints
float fAmountToAddDistance = m_fMaxSpeedDistance * (m_fCurSeqPoint / m_fAccelPoint);
float fAmountToAddHeight = m_fMaxSpeedHeight * (m_fCurSeqPoint / m_fAccelPoint);
float fAmountToAddRotation = m_fMaxSpeedRotation * (m_fCurSeqPoint / m_fAccelPoint);

// Move the camera
GFX->setCameraDistance(GFX->getCameraDistance() + fAmountToAddDistance);
GFX->setCameraHeight(GFX->getCameraHeight() + fAmountToAddHeight);
GFX->setCameraRotation(GFX->getCameraRotation() + fAmountToAddRotation);
}

As opposed to simply adding MaxSpeed until the total distance is traversed. It's the counting for delta time that makes all the difference.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this