#include <simgear/compiler.h>
#include <simgear/scene/util/SGSceneUserData.hxx>
-
-#include "location.hxx"
-#include "placementtrans.hxx"
+#include <simgear/scene/util/SGUpdateVisitor.hxx>
#include "placement.hxx"
_pitch_deg(0),
_heading_deg(0),
_selector(new osg::Switch),
- _transform(new SGPlacementTransform),
- _location(new SGLocation)
+ _transform(new SGPlacementTransform)
{
}
SGModelPlacement::~SGModelPlacement ()
{
- delete _location;
}
void
void
SGModelPlacement::update()
{
- _location->setPosition( _position.getLongitudeDeg(),
- _position.getLatitudeDeg(),
- _position.getElevationFt() );
- _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
+ // The cartesian position
+ SGVec3d position = SGVec3d::fromGeod(_position);
- const sgVec4 *t = _location->getTransformMatrix();
- SGMatrixd rotation;
- for (unsigned i = 0; i < 4; ++i)
- for (unsigned j = 0; j < 4; ++j)
- rotation(i, j) = t[j][i];
- SGVec3d pos(_location->get_absolute_view_pos());
- _transform->setTransform(pos, rotation);
+ // The orientation, composed from the horizontal local orientation and the
+ // orientation wrt the horizontal local frame
+ SGQuatd orient = SGQuatd::fromLonLat(_position);
+ orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
+ orient *= SGQuatd::fromYawPitchRollDeg(-_heading_deg, _pitch_deg, -_roll_deg);
+ _transform->setTransform(position, orient);
}
bool
orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
}
+void
+SGModelPlacement::setReferenceTime(const double& referenceTime)
+{
+ SGSceneUserData* userData;
+ userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
+ SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
+ vel->referenceTime = referenceTime;
+}
+
void
SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
{
SGSceneUserData* userData;
userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
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
SGSceneUserData* userData;
userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
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