API Question Vessel velocity in ECEF?

As advertised:
Code:
VECTOR3 GetPosition_ECEF( VESSEL* hV, OBJHANDLE hObj )
{
	VECTOR3 r;
	VECTOR3 ECEF_pos;

	hV->GetGlobalPos( r );
	oapiGlobalToLocal( hObj, &r, &ECEF_pos );

	ECEF_pos = _V( ECEF_pos.x, ECEF_pos.z, ECEF_pos.y );
	return ECEF_pos;
}

VECTOR3 GetPosition_ECI( VESSEL* hV, OBJHANDLE hObj )
{
	VECTOR3 r;
	VECTOR3 ECI_pos;
	MATRIX3 R;

	hV->GetRelativePos( hObj, r );
	oapiGetPlanetObliquityMatrix( hObj, &R );

	ECI_pos = tmul( R, r );

	ECI_pos = _V( ECI_pos.x, ECI_pos.z, ECI_pos.y );
	return ECI_pos;
}

VECTOR3 GetVelocity_ECEF( VESSEL* hV, OBJHANDLE hObj )
{
	VECTOR3 r;
	VECTOR3 v;
	VECTOR3 ECEF_vel;
	MATRIX3 R;

	hV->GetRelativePos( hObj, r );
	hV->GetRelativeVel( hObj, v );
	oapiGetRotationMatrix( hObj, &R );

	VECTOR3 vloc = tmul( R, v );
	VECTOR3 rloc = tmul( R, r );
	double s = atan2( rloc.z, rloc.x );
	double T = oapiGetPlanetPeriod( hObj );
	VECTOR3 vsurf = _V( -sin( s ), 0.0, cos( s ) ) * PI2 / T * hypot( rloc.x, rloc.z );

	ECEF_vel = vloc - vsurf;

	ECEF_vel = _V( ECEF_vel.x, ECEF_vel.z, ECEF_vel.y );
	return ECEF_vel;
}

VECTOR3 GetVelocity_ECI( VESSEL* hV, OBJHANDLE hObj )
{
	VECTOR3 r;
	VECTOR3 v;
	VECTOR3 ECI_vel;
	MATRIX3 R;

	hV->GetRelativePos( hObj, r );
	hV->GetRelativeVel( hObj, v );
	oapiGetPlanetObliquityMatrix( hObj, &R );

	ECI_vel = tmul( R, v );

	ECI_vel = _V( ECI_vel.x, ECI_vel.z, ECI_vel.y );
	return ECI_vel;
}

Might be more efficient if some GetRelativePos calls (and others) were made outside and the vector passed as an argment... depends on how expensive those functions are... Another alternative is to joint the code into one "large" function and calculate everything at once, but the user might not need all 4 parameters... :shrug:
Anyway, it works as is. Thanks to all! :tiphat:
 
Back
Top