1 // placement.cxx - manage the placment of a 3D model.
2 // Written by David Megginson, started 2002.
4 // This file is in the Public Domain, and comes with no warranty.
7 #include <simgear_config.h>
10 #include "placement.hxx"
12 #include <simgear/compiler.h>
13 #include <simgear/scene/util/OsgMath.hxx>
14 #include <simgear/scene/util/SGSceneUserData.hxx>
17 ////////////////////////////////////////////////////////////////////////
18 // Implementation of SGModelPlacement.
19 ////////////////////////////////////////////////////////////////////////
21 SGModelPlacement::SGModelPlacement () :
22 _position(SGGeod::fromRad(0, 0)),
26 _selector(new osg::Switch),
27 _transform(new osg::PositionAttitudeTransform)
29 _selector->addChild(_transform.get());
32 SGModelPlacement::~SGModelPlacement ()
37 SGModelPlacement::init( osg::Node * model )
39 // remove previous models (in case of reinit)
40 _transform->removeChild(0, _transform->getNumChildren());
42 _transform->addChild(model);
44 _selector->setValue(0, 1);
48 SGModelPlacement::add( osg::Node* model )
51 _transform->addChild(model);
55 void SGModelPlacement::clear()
62 SGModelPlacement::update()
64 // The cartesian position
65 SGVec3d position = SGVec3d::fromGeod(_position);
66 _transform->setPosition(toOsg(position));
68 // The orientation, composed from the horizontal local orientation and the
69 // orientation wrt the horizontal local frame
70 SGQuatd orient = SGQuatd::fromLonLat(_position);
71 orient *= SGQuatd::fromYawPitchRollDeg(_heading_deg, _pitch_deg, _roll_deg);
72 // Convert to the scenegraph orientation where we just rotate around
73 // the y axis 180 degrees.
74 orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
76 _transform->setAttitude(toOsg(orient));
80 SGModelPlacement::getVisible () const
82 return _selector->getValue(0);
86 SGModelPlacement::setVisible (bool visible)
88 _selector->setValue(0, visible);
92 SGModelPlacement::setPosition(const SGGeod& position)
98 SGModelPlacement::setRollDeg (double roll_deg)
100 _roll_deg = roll_deg;
104 SGModelPlacement::setPitchDeg (double pitch_deg)
106 _pitch_deg = pitch_deg;
110 SGModelPlacement::setHeadingDeg (double heading_deg)
112 _heading_deg = heading_deg;
116 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
119 _roll_deg = roll_deg;
120 _pitch_deg = pitch_deg;
121 _heading_deg = heading_deg;
125 SGModelPlacement::setOrientation (const SGQuatd& orientation)
127 orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
131 SGModelPlacement::setReferenceTime(const double& referenceTime)
133 SGSceneUserData* userData;
134 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
135 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
136 vel->referenceTime = referenceTime;
140 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
142 SGSceneUserData* userData;
143 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
144 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
145 vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
149 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
151 SGSceneUserData* userData;
152 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
153 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
154 vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);