Files
simgear/simgear/scene/model/placement.cxx
T
Mathias Froehlich 2cc5e776b3 math: Remove SGMath osg dependency.
Move osg dependent stuff from SGMath into simgear/scene/util/OsgMath.hxx.
Update includes in simgear to reflect this change.
Note that this change also requires an updated flightgear version.
2012-03-03 13:35:20 +01:00

168 lines
3.8 KiB
C++

// placement.cxx - manage the placment of a 3D model.
// Written by David Megginson, started 2002.
//
// This file is in the Public Domain, and comes with no warranty.
#ifdef HAVE_CONFIG_H
#include <simgear_config.h>
#endif
#include "placement.hxx"
#include <simgear/compiler.h>
#include <simgear/scene/util/OsgMath.hxx>
#include <simgear/scene/util/SGSceneUserData.hxx>
////////////////////////////////////////////////////////////////////////
// Implementation of SGModelPlacement.
////////////////////////////////////////////////////////////////////////
SGModelPlacement::SGModelPlacement () :
_position(SGGeod::fromRad(0, 0)),
_roll_deg(0),
_pitch_deg(0),
_heading_deg(0),
_selector(new osg::Switch),
_transform(new osg::PositionAttitudeTransform)
{
_selector->addChild(_transform.get());
}
SGModelPlacement::~SGModelPlacement ()
{
}
void
SGModelPlacement::init( osg::Node * model )
{
// remove previous model (in case of reinit)
_transform->removeChild(0,1);
if (model != 0) {
_transform->addChild(model);
}
_selector->setValue(0, 1);
}
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::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
SGModelPlacement::getVisible () const
{
return _selector->getValue(0);
}
void
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)
{
_position = position;
}
void
SGModelPlacement::setRollDeg (double roll_deg)
{
_roll_deg = roll_deg;
}
void
SGModelPlacement::setPitchDeg (double pitch_deg)
{
_pitch_deg = pitch_deg;
}
void
SGModelPlacement::setHeadingDeg (double heading_deg)
{
_heading_deg = heading_deg;
}
void
SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
double heading_deg)
{
_roll_deg = roll_deg;
_pitch_deg = pitch_deg;
_heading_deg = heading_deg;
}
void
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.get());
SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
}
void
SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
{
SGSceneUserData* userData;
userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);
}
// end of model.cxx