Sign in to follow this  

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

Recommended Posts

Hexer    133
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
oliii    2196
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

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