FGViewer::recalcLookFrom turned out to be an excellent source of information for prosition and orientation

This commit is contained in:
ehofman 2009-10-26 21:06:45 +00:00 committed by Tim Moore
parent 84dc82506a
commit 76c79dba8e
5 changed files with 29 additions and 37 deletions

View File

@ -359,29 +359,15 @@ void SGSampleGroup::update_sample_config( SGSoundSample *sample ) {
if ( sample->is_valid_source() ) { if ( sample->is_valid_source() ) {
unsigned int source = sample->get_source(); unsigned int source = sample->get_source();
#if 1
if ( _tied_to_listener && _smgr->has_changed() ) { if ( _tied_to_listener && _smgr->has_changed() ) {
alSourcefv( source, AL_POSITION, _smgr->get_position().data() ); alSourcefv( source, AL_POSITION, _smgr->get_position().data() );
alSourcefv( source, AL_VELOCITY, _smgr->get_velocity().data() ); alSourcefv( source, AL_VELOCITY, _smgr->get_velocity().data() );
#if 0
alSourcefv( source, AL_DIRECTION, _smgr->get_direction().data() ); alSourcefv( source, AL_DIRECTION, _smgr->get_direction().data() );
#endif
} else { } else {
float *pos = sample->get_position();
if (isnan(pos[0]) || isnan(pos[1]) || isnan(pos[2])) printf("NaN detected in source position\n");
alSourcefv( source, AL_POSITION, sample->get_position() ); alSourcefv( source, AL_POSITION, sample->get_position() );
float *vel = sample->get_velocity();
if (isnan(vel[0]) || isnan(vel[1]) || isnan(vel[2])) printf("NaN detected in source velocity\n");
alSourcefv( source, AL_VELOCITY, sample->get_velocity() ); alSourcefv( source, AL_VELOCITY, sample->get_velocity() );
#if 0
alSourcefv( source, AL_DIRECTION, sample->get_orientation() ); alSourcefv( source, AL_DIRECTION, sample->get_orientation() );
#endif
} }
#else
alSourcefv( source, AL_POSITION, SGVec3f::zeros().data() );
alSourcefv( source, AL_DIRECTION, SGVec3f::zeros().data() );
alSourcefv( source, AL_VELOCITY, SGVec3f::zeros().data() );
#endif
testForALError("position and orientation"); testForALError("position and orientation");
alSourcef( source, AL_PITCH, sample->get_pitch() ); alSourcef( source, AL_PITCH, sample->get_pitch() );
@ -389,11 +375,9 @@ if (isnan(vel[0]) || isnan(vel[1]) || isnan(vel[2])) printf("NaN detected in sou
testForALError("pitch and gain"); testForALError("pitch and gain");
if ( sample->has_static_data_changed() ) { if ( sample->has_static_data_changed() ) {
#if 0
alSourcef( source, AL_CONE_INNER_ANGLE, sample->get_innerangle() ); alSourcef( source, AL_CONE_INNER_ANGLE, sample->get_innerangle() );
alSourcef( source, AL_CONE_OUTER_ANGLE, sample->get_outerangle() ); alSourcef( source, AL_CONE_OUTER_ANGLE, sample->get_outerangle() );
alSourcef( source, AL_CONE_OUTER_GAIN, sample->get_outergain() ); alSourcef( source, AL_CONE_OUTER_GAIN, sample->get_outergain() );
#endif
testForALError("audio cone"); testForALError("audio cone");
alSourcef( source, AL_MAX_DISTANCE, sample->get_max_dist() ); alSourcef( source, AL_MAX_DISTANCE, sample->get_max_dist() );

View File

@ -49,7 +49,7 @@ SGSoundSample::SGSoundSample() :
_velocity(SGVec3d::zeros()), _velocity(SGVec3d::zeros()),
_orientation(SGQuatd::zeros()), _orientation(SGQuatd::zeros()),
_orivec(SGVec3f::zeros()), _orivec(SGVec3f::zeros()),
_base_pos(SGGeod()), _base_pos(SGGeod::fromDeg(0,0)),
_refname(random_string()), _refname(random_string()),
_data(NULL), _data(NULL),
_format(AL_FORMAT_MONO8), _format(AL_FORMAT_MONO8),
@ -83,7 +83,7 @@ SGSoundSample::SGSoundSample( const char *path, const char *file ) :
_velocity(SGVec3d::zeros()), _velocity(SGVec3d::zeros()),
_orientation(SGQuatd::zeros()), _orientation(SGQuatd::zeros()),
_orivec(SGVec3f::zeros()), _orivec(SGVec3f::zeros()),
_base_pos(SGGeod()), _base_pos(SGGeod::fromDeg(0,0)),
_refname(file), _refname(file),
_data(NULL), _data(NULL),
_format(AL_FORMAT_MONO8), _format(AL_FORMAT_MONO8),
@ -126,7 +126,7 @@ SGSoundSample::SGSoundSample( const unsigned char** data,
_velocity(SGVec3d::zeros()), _velocity(SGVec3d::zeros()),
_orientation(SGQuatd::zeros()), _orientation(SGQuatd::zeros()),
_orivec(SGVec3f::zeros()), _orivec(SGVec3f::zeros()),
_base_pos(SGGeod()), _base_pos(SGGeod::fromDeg(0,0)),
_refname(random_string()), _refname(random_string()),
_format(format), _format(format),
_size(len), _size(len),
@ -161,7 +161,7 @@ SGSoundSample::SGSoundSample( void** data, int len, int freq, int format ) :
_velocity(SGVec3d::zeros()), _velocity(SGVec3d::zeros()),
_orientation(SGQuatd::zeros()), _orientation(SGQuatd::zeros()),
_orivec(SGVec3f::zeros()), _orivec(SGVec3f::zeros()),
_base_pos(SGGeod()), _base_pos(SGGeod::fromDeg(0,0)),
_refname(random_string()), _refname(random_string()),
_format(format), _format(format),
_size(len), _size(len),
@ -220,11 +220,26 @@ void SGSoundSample::set_position( const SGGeod& pos ) {
} }
void SGSoundSample::update_absolute_position() { void SGSoundSample::update_absolute_position() {
SGQuatd orient = SGQuatd::fromLonLat(_base_pos) * _orientation; // SGQuatd orient = SGQuatd::fromLonLat(_base_pos) * _orientation;
_orivec = -toVec3f(orient.rotate(-SGVec3d::e1())); // _orivec = -toVec3f(orient.rotate(-SGVec3d::e1()));
orient = SGQuatd::fromRealImag(0, _relative_pos) * _orientation; // The rotation rotating from the earth centerd frame to
_absolute_pos = -SGVec3d::fromGeod(_base_pos); // -orient.rotate(SGVec3d::e1()); // the horizontal local frame
SGQuatd hlOr = SGQuatd::fromLonLat(_base_pos);
// Compute the eyepoints orientation and position
// wrt the earth centered frame - that is global coorinates
SGQuatd ec2body = hlOr*_orientation;
// This is rotates the x-forward, y-right, z-down coordinate system where
// simulation runs into the OpenGL camera system with x-right, y-up, z-back.
SGQuatd q(-0.5, -0.5, 0.5, 0.5);
// The cartesian position of the basic view coordinate
SGVec3d position = SGVec3d::fromGeod(_base_pos);
_absolute_pos = position + (ec2body*q).backTransform(_relative_pos);
_orivec = toVec3f( (ec2body*q).backTransform(_direction) );
} }
string SGSoundSample::random_string() { string SGSoundSample::random_string() {

View File

@ -252,15 +252,8 @@ void SGSoundMgr::update_late( double dt ) {
if (_changed) { if (_changed) {
alListenerf( AL_GAIN, _volume ); alListenerf( AL_GAIN, _volume );
#if 0
alListenerfv( AL_ORIENTATION, _at_up_vec ); alListenerfv( AL_ORIENTATION, _at_up_vec );
#endif
double *pos = _position.data();
if (isnan(pos[0]) || isnan(pos[1]) || isnan(pos[2])) printf("NaN detected in listener position\n");
alListenerfv( AL_POSITION, toVec3f(_position).data() ); alListenerfv( AL_POSITION, toVec3f(_position).data() );
double *vel = _velocity.data();
if (isnan(vel[0]) || isnan(vel[1]) || isnan(vel[2])) printf("NaN detected in listener velocity\n");
alListenerfv( AL_VELOCITY, toVec3f(_velocity).data() ); alListenerfv( AL_VELOCITY, toVec3f(_velocity).data() );
// alDopplerVelocity(340.3); // TODO: altitude dependent // alDopplerVelocity(340.3); // TODO: altitude dependent
testForALError("update"); testForALError("update");

View File

@ -159,7 +159,7 @@ public:
* @param pos OpenAL listener position * @param pos OpenAL listener position
*/ */
void set_position( const SGVec3d& pos ) { void set_position( const SGVec3d& pos ) {
_position = -pos; _position = pos;
_changed = true; _changed = true;
} }

View File

@ -41,8 +41,8 @@
static double _snd_inv(double v) { return (v == 0) ? 1e99 : 1/v; } static double _snd_inv(double v) { return (v == 0) ? 1e99 : 1/v; }
static double _snd_abs(double v) { return (v >= 0) ? v : -v; } static double _snd_abs(double v) { return (v >= 0) ? v : -v; }
static double _snd_sqrt(double v) { return sqrt(fabs(v)); } static double _snd_sqrt(double v) { return sqrt(fabs(v)); }
static double _snd_log10(double v) { return log10(fabs(v)); } static double _snd_log10(double v) { return log10(fabs(v)+1e-9); }
static double _snd_log(double v) { return log(fabs(v)); } static double _snd_log(double v) { return log(fabs(v)+1e-9); }
// static double _snd_sqr(double v) { return v*v; } // static double _snd_sqr(double v) { return v*v; }
// static double _snd_pow3(double v) { return v*v*v; } // static double _snd_pow3(double v) { return v*v*v; }
@ -243,9 +243,9 @@ SGXmlSound::init(SGPropertyNode *root, SGPropertyNode *node,
float outer_gain = 0.0; float outer_gain = 0.0;
prop = node->getChild("orientation"); prop = node->getChild("orientation");
if ( prop != NULL ) { if ( prop != NULL ) {
dir = SGVec3d(-prop->getDoubleValue("x", 0.0), dir = SGVec3d(prop->getDoubleValue("y", 0.0),
-prop->getDoubleValue("y", 0.0), prop->getDoubleValue("z", 0.0),
-prop->getDoubleValue("z", 0.0)); prop->getDoubleValue("x", 0.0));
inner = prop->getDoubleValue("inner-angle", 360.0); inner = prop->getDoubleValue("inner-angle", 360.0);
outer = prop->getDoubleValue("outer-angle", 360.0); outer = prop->getDoubleValue("outer-angle", 360.0);
outer_gain = prop->getDoubleValue("outer-gain", 0.0); outer_gain = prop->getDoubleValue("outer-gain", 0.0);