FGViewer::recalcLookFrom turned out to be an excellent source of information for prosition and orientation
This commit is contained in:
parent
84dc82506a
commit
76c79dba8e
@ -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() );
|
||||||
|
@ -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() {
|
||||||
|
@ -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");
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user