Incremental improvement of openal sound velocities. This should help
stabilize some of the odd artifacts we were hearing, that were especially noticable in clean sound samples like the stall horn or the marker beacon codes. The change still preserves the doppler effect and maintains the good work of a previous developer figuring out how to align the model and listener velocity vectors correctly.
This commit is contained in:
parent
51283147db
commit
4529449b83
1 changed files with 40 additions and 24 deletions
|
@ -208,6 +208,12 @@ static void fgMainLoop( void ) {
|
||||||
= fgGetNode("/position/latitude-deg");
|
= fgGetNode("/position/latitude-deg");
|
||||||
static SGConstPropertyNode_ptr altitude
|
static SGConstPropertyNode_ptr altitude
|
||||||
= fgGetNode("/position/altitude-ft");
|
= fgGetNode("/position/altitude-ft");
|
||||||
|
static SGConstPropertyNode_ptr vn_fps
|
||||||
|
= fgGetNode("/velocities/speed-north-fps");
|
||||||
|
static SGConstPropertyNode_ptr ve_fps
|
||||||
|
= fgGetNode("/velocities/speed-east-fps");
|
||||||
|
static SGConstPropertyNode_ptr vd_fps
|
||||||
|
= fgGetNode("/velocities/speed-down-fps");
|
||||||
static SGConstPropertyNode_ptr clock_freeze
|
static SGConstPropertyNode_ptr clock_freeze
|
||||||
= fgGetNode("/sim/freeze/clock", true);
|
= fgGetNode("/sim/freeze/clock", true);
|
||||||
static SGConstPropertyNode_ptr cur_time_override
|
static SGConstPropertyNode_ptr cur_time_override
|
||||||
|
@ -543,7 +549,7 @@ static void fgMainLoop( void ) {
|
||||||
// aircraft is the source of all sounds and that all sounds are
|
// aircraft is the source of all sounds and that all sounds are
|
||||||
// positioned in the aircraft base
|
// positioned in the aircraft base
|
||||||
|
|
||||||
static sgdVec3 last_visitor_pos = {0, 0, 0};
|
static sgdVec3 last_listener_pos = {0, 0, 0};
|
||||||
static sgdVec3 last_model_pos = {0, 0, 0};
|
static sgdVec3 last_model_pos = {0, 0, 0};
|
||||||
|
|
||||||
// get the orientation
|
// get the orientation
|
||||||
|
@ -574,20 +580,28 @@ static void fgMainLoop( void ) {
|
||||||
acmodel_loc = (SGLocation *)globals->
|
acmodel_loc = (SGLocation *)globals->
|
||||||
get_aircraft_model()->get3DModel()->getSGLocation();
|
get_aircraft_model()->get3DModel()->getSGLocation();
|
||||||
|
|
||||||
// calculate speed of visitor and model
|
// Calculate speed of listener and model. This code assumes the
|
||||||
|
// listener is either tracking the model at the same speed or
|
||||||
|
// stationary.
|
||||||
|
|
||||||
sgVec3 listener_vel, model_vel;
|
sgVec3 listener_vel, model_vel;
|
||||||
SGVec3d SGV3d_help;
|
SGVec3d SGV3d_help;
|
||||||
sgdVec3 sgdv3_help;
|
sgdVec3 sgdv3_help;
|
||||||
sgdVec3 sgdv3_null = {0, 0, 0};
|
sgdVec3 sgdv3_null = {0, 0, 0};
|
||||||
|
|
||||||
sgdSubVec3( sgdv3_help,
|
// the aircraft velocity as reported by the fdm (this will not
|
||||||
last_visitor_pos, (double *)¤t_view->get_view_pos());
|
// vary or be affected by frame rates or timing jitter.)
|
||||||
sgdAddVec3( last_visitor_pos, sgdv3_null, (double *)¤t_view->get_view_pos());
|
sgVec3 fdm_vel_vec;
|
||||||
SGV3d_help = model_or.rotateBack(
|
sgSetVec3( fdm_vel_vec,
|
||||||
surf_or.rotateBack(SGVec3d(sgdv3_help[0],
|
vn_fps->getDoubleValue() * SG_FEET_TO_METER,
|
||||||
sgdv3_help[1], sgdv3_help[2])));
|
ve_fps->getDoubleValue() * SG_FEET_TO_METER,
|
||||||
sgSetVec3( listener_vel, SGV3d_help[0], SGV3d_help[1], SGV3d_help[2]);
|
vd_fps->getDoubleValue() * SG_FEET_TO_METER );
|
||||||
|
double fdm_vel = sgLengthVec3(fdm_vel_vec);
|
||||||
|
|
||||||
|
// compute the aircraft velocity vector and scale it to the length
|
||||||
|
// of the fdm velocity vector. This gives us a vector in the
|
||||||
|
// proper coordinate system, but also with the proper time
|
||||||
|
// invariant magnitude.
|
||||||
sgdSubVec3( sgdv3_help,
|
sgdSubVec3( sgdv3_help,
|
||||||
last_model_pos, acmodel_loc->get_absolute_view_pos());
|
last_model_pos, acmodel_loc->get_absolute_view_pos());
|
||||||
sgdAddVec3( last_model_pos, sgdv3_null, acmodel_loc->get_absolute_view_pos());
|
sgdAddVec3( last_model_pos, sgdv3_null, acmodel_loc->get_absolute_view_pos());
|
||||||
|
@ -596,24 +610,26 @@ static void fgMainLoop( void ) {
|
||||||
sgdv3_help[1], sgdv3_help[2])));
|
sgdv3_help[1], sgdv3_help[2])));
|
||||||
sgSetVec3( model_vel, SGV3d_help[0], SGV3d_help[1], SGV3d_help[2]);
|
sgSetVec3( model_vel, SGV3d_help[0], SGV3d_help[1], SGV3d_help[2]);
|
||||||
|
|
||||||
if (delta_time_sec > 0) {
|
float vel = sgLengthVec3(model_vel);
|
||||||
sgScaleVec3( model_vel, 1 / delta_time_sec );
|
if ( fabs(vel) > 0.0001 ) {
|
||||||
sgScaleVec3( listener_vel, 1 / delta_time_sec );
|
if ( fabs(fdm_vel / vel) > 0.0001 ) {
|
||||||
|
sgScaleVec3( model_vel, fdm_vel / vel );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// checking, if the listener pos has moved suddenly
|
// check for moving or stationary listener (view position)
|
||||||
if (sgLengthVec3(listener_vel) > 1000)
|
sgdSubVec3( sgdv3_help,
|
||||||
{
|
last_listener_pos, (double *)¤t_view->get_view_pos());
|
||||||
// check if the relative speed model vs listener has moved suddenly, too
|
sgdAddVec3( last_listener_pos,
|
||||||
sgVec3 delta_vel;
|
sgdv3_null, (double *)¤t_view->get_view_pos());
|
||||||
sgSubVec3(delta_vel, listener_vel, model_vel );
|
|
||||||
if (sgLengthVec3(delta_vel) > 1000)
|
if ( sgdLengthVec3(sgdv3_help) > 0.00001 ) {
|
||||||
sgSetVec3(listener_vel, model_vel[0], model_vel[1], model_vel[2] ); // a sane value
|
sgCopyVec3( listener_vel, model_vel );
|
||||||
else
|
} else {
|
||||||
globals->get_soundmgr()->set_listener_vel( listener_vel );
|
sgSetVec3( listener_vel, 0.0, 0.0, 0.0 );
|
||||||
}
|
}
|
||||||
else
|
|
||||||
globals->get_soundmgr()->set_listener_vel( listener_vel );
|
globals->get_soundmgr()->set_listener_vel( listener_vel );
|
||||||
|
|
||||||
// set positional offset for sources
|
// set positional offset for sources
|
||||||
sgdVec3 dsource_pos_offset;
|
sgdVec3 dsource_pos_offset;
|
||||||
|
|
Loading…
Reference in a new issue