Error rotating object along its path

Started by
3 comments, last by Cigguh 17 years, 3 months ago
Hi. There are many topics like that on net but none has helped me with this problem. I have three points: p1-source position p2-current object position (interpolated between p1 and p3) p3-destination point I need to know the angle of rotation(absolute) that should be applied to the object so i'll always look in its moving direction. Here's what i've got but somewhere i went wrong. Please help.

float GetAngle2D( const D3DXVECTOR3* p1, const D3DXVECTOR3* p2, const D3DXVECTOR3* p3 )
{

	D3DXVECTOR2 v1, v2, v3;
	v1 = D3DXVECTOR2( p1->x, p1->z );
	v2 = D3DXVECTOR2( p2->x, p2->z );
	v3 = D3DXVECTOR2( p3->x, p3->z );

	v1 = v3 - v2;
	v2 = v1 - v3;

	D3DXVec2Normalize( &v1, &v1 );
	D3DXVec2Normalize( &v2, &v2 );
	
	float fAngle = atan2f( v2.x - v1.x, v2.y - v1.y );

	return fAngle;

}

And that's how i call it (just in case).

D3DXVec3CatmullRom( &vp, &p[0], &p[1], &p[2], &p[3], m_fStep );
float fA = NMATH::GetAngle2D( &p[1], &vp, &p[2] );

m_pCam->SetPosition( &vp );
m_pCam->SetRotation( 0.0f, fA, 0.0f );

i make the game so i be ballin
Advertisement
Personnaly, I would use the derivative of the catmul-rom spline to get the direction. Or, store that value for the control points, and interpolate (linearly or otherwise). It's easy to derive, but I'm not 100% sure the catmull-rom is continuous on the first derivative.

also, check out

http://www.mvps.org/directx/articles/catmull/

Everything is better with Metal.

Yes, this sample looks like what i need but it uses directx framework which makes it not too clear :(
i make the game so i be ballin
in any case, your method looks wrong. if all you want is the direction the spline is going at a particular point, then use the second derivative.

q(t) = 0.5 *((2 * P1) + (-P0 + P2) * t +              (2*P0 - 5*P1 + 4*P2 - P3) * t^2 +              (-P0 + 3*P1- 3*P2 + P3) * t^3));

derive and you should get

q'(t) = 0.5 *((2 * P1) + (-P0 + P2) +               (2*P0 - 5*P1 + 4*P2 - P3) * 2 * t +               (-P0 + 3*P1- 3*P2 + P3) * 3 * t^2));

the vector q'(t) should give you the look direction for your camera.

Equally, derive again and you get

q'''(t) = 0.5 *((2*P0 - 5*P1 + 4*P2 - P3) * 2 +                (-P0 + 3*P1- 3*P2 + P3) * 6 * t));


q'''(t) is the 'acceleration' of the spline at a point, or if you will, for a road surface, will give you the natural 'banking' or curvature of the spline at a point.

Again, I am not sure about the continuity of the curve at the first and second derivative, so you may find 'breaks'. Let me check on the wiki :)

EDIT : Ah, it's not C2 continous, but it is C1 continuous, so using the first derivative for the direction of your camera will be fine.

I would then recommend calculating the second derivative at the control points, and lineraly interpolate along that that section to get the curvature of the spline (or if you want, the natural 'up' vector of your camera).

Everything is better with Metal.

Thanks alot.
It works fine now.
i make the game so i be ballin

This topic is closed to new replies.

Advertisement