X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fscene%2Fmodel%2Fplacement.cxx;h=c1a7d83badf1a4000dcad9e6df4f1b450949f1f4;hb=32a6bd78d8bf143f40922f1a0bc7a88ea7706a7d;hp=f781ab3e2b343922e2cd8c1f8d4c9a81ddec9dac;hpb=31324761ccb5687f94f8dc5ae054691d4751a507;p=simgear.git diff --git a/simgear/scene/model/placement.cxx b/simgear/scene/model/placement.cxx index f781ab3e..c1a7d83b 100644 --- a/simgear/scene/model/placement.cxx +++ b/simgear/scene/model/placement.cxx @@ -7,14 +7,11 @@ #include #endif -#include - -#include - -#include "placementtrans.hxx" - #include "placement.hxx" +#include +#include +#include //////////////////////////////////////////////////////////////////////// @@ -27,8 +24,9 @@ SGModelPlacement::SGModelPlacement () : _pitch_deg(0), _heading_deg(0), _selector(new osg::Switch), - _transform(new SGPlacementTransform) + _transform(new osg::PositionAttitudeTransform) { + _selector->addChild(_transform.get()); } SGModelPlacement::~SGModelPlacement () @@ -38,26 +36,44 @@ SGModelPlacement::~SGModelPlacement () void SGModelPlacement::init( osg::Node * model ) { + // remove previous models (in case of reinit) + _transform->removeChild(0, _transform->getNumChildren()); if (model != 0) { _transform->addChild(model); } - _selector->addChild(_transform.get()); _selector->setValue(0, 1); } +void +SGModelPlacement::add( osg::Node* model ) +{ + if (model != 0) { + _transform->addChild(model); + } +} + +void SGModelPlacement::clear() +{ + _selector = NULL; + _transform = NULL; +} + void SGModelPlacement::update() { // The cartesian position SGVec3d position = SGVec3d::fromGeod(_position); + _transform->setPosition(toOsg(position)); // The orientation, composed from the horizontal local orientation and the // orientation wrt the horizontal local frame SGQuatd orient = SGQuatd::fromLonLat(_position); - orient *= SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0)); - orient *= SGQuatd::fromYawPitchRollDeg(-_heading_deg, _pitch_deg, -_roll_deg); - SGMatrixd rotation(inverse(orient)); - _transform->setTransform(position, rotation); + orient *= SGQuatd::fromYawPitchRollDeg(_heading_deg, _pitch_deg, _roll_deg); + // Convert to the scenegraph orientation where we just rotate around + // the y axis 180 degrees. + orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0)); + + _transform->setAttitude(toOsg(orient)); } bool @@ -72,30 +88,6 @@ SGModelPlacement::setVisible (bool visible) _selector->setValue(0, visible); } -void -SGModelPlacement::setLongitudeDeg (double lon_deg) -{ - _position.setLongitudeDeg(lon_deg); -} - -void -SGModelPlacement::setLatitudeDeg (double lat_deg) -{ - _position.setLatitudeDeg(lat_deg); -} - -void -SGModelPlacement::setElevationFt (double elev_ft) -{ - _position.setElevationFt(elev_ft); -} - -void -SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft) -{ - _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft); -} - void SGModelPlacement::setPosition(const SGGeod& position) { @@ -135,24 +127,31 @@ SGModelPlacement::setOrientation (const SGQuatd& orientation) orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg); } +void +SGModelPlacement::setReferenceTime(const double& referenceTime) +{ + SGSceneUserData* userData; + userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get()); + SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity(); + vel->referenceTime = referenceTime; +} + void SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear) { SGSceneUserData* userData; - userData = SGSceneUserData::getOrCreateSceneUserData(_transform); + userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get()); SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity(); - SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0)); - vel->linear = orientation.backTransform(linear); + vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]); } void SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular) { SGSceneUserData* userData; - userData = SGSceneUserData::getOrCreateSceneUserData(_transform); + userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get()); SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity(); - SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0)); - vel->angular = orientation.backTransform(angular); + vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]); } // end of model.cxx