Sign in to follow this  

Procedural Catmull-Rom waypoints: How to clamp camera speed?

This topic is 3936 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hello, I’m writing a procedurally-generated camera fly-by sequence based on a set of generated waypoints. For the waypoint following I use the standard Catmull-Rom function equivalent to D3DXVec3CatmullRom() that takes the four input vectors and a scalar of t between 0 and 1. Since most of the waypoints are not evenly spaced I get varying camera movement speeds between different waypoints which is not what I want. So the question is: what is a good way to calculate t-increments in a way that would make the movement speed consistent across the Catmull-Rom path? I’ve looked into the variable key-frame method but it uses key-frame time, which I don’t know how to generate for the waypoints. All I have is the set of vectors for waypoints. Does anybody know of a good way to do this? Thanks in advance, -Iv

Share this post


Link to post
Share on other sites
Don't think there is a sure-fire mathematical way to do this.

How about :

Sub-Sample the spline, recording how far you travelled along the spline for each increment of (t). So you get a sort of look up table of distance <-> t (you calculate the distance maybe using an even more minute sampling method, kinda likea numerical intergration). Then you can LUT for a given distance the correct t value, using basic linear interpolation. You'll get some error I guess, it wont be perfect, but should be almost unnoticeable, if you sub-sample enough.


void BuildCatmullRomLUT(C_CatmullRomSpline* pSpline, float* LUT[2], int LUTSize)
{
LUT[0][0] = 0.0f;
LUT[0][1] = 0.0f;

float t = 0.0f;
float dt = 1.0f / LUTSize;
for(int i = 1; i < LUTSize; i ++, t += dt)
{
// spline calculates the length of the portion between [t, t+dt],
// using 100 intervals for accuracy.
float delta = pSpline->EvaluateLength(t, t + dt, 100);
LUT[i][0] = LUT[i-1][0] + delta;
LUT[i][1] = LUT[i-1][1] + dt;
}
}


Share this post


Link to post
Share on other sites

This topic is 3936 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

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