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 model (in case of reinit)
40 _transform->removeChild(0,1);
42 _transform->addChild(model);
44 _selector->setValue(0, 1);
47 void SGModelPlacement::clear()
54 SGModelPlacement::update()
56 // The cartesian position
57 SGVec3d position = SGVec3d::fromGeod(_position);
58 _transform->setPosition(toOsg(position));
60 // The orientation, composed from the horizontal local orientation and the
61 // orientation wrt the horizontal local frame
62 SGQuatd orient = SGQuatd::fromLonLat(_position);
63 orient *= SGQuatd::fromYawPitchRollDeg(_heading_deg, _pitch_deg, _roll_deg);
64 // Convert to the scenegraph orientation where we just rotate around
65 // the y axis 180 degrees.
66 orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
68 _transform->setAttitude(toOsg(orient));
72 SGModelPlacement::getVisible () const
74 return _selector->getValue(0);
78 SGModelPlacement::setVisible (bool visible)
80 _selector->setValue(0, visible);
84 SGModelPlacement::setLongitudeDeg (double lon_deg)
86 _position.setLongitudeDeg(lon_deg);
90 SGModelPlacement::setLatitudeDeg (double lat_deg)
92 _position.setLatitudeDeg(lat_deg);
96 SGModelPlacement::setElevationFt (double elev_ft)
98 _position.setElevationFt(elev_ft);
102 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
104 _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
108 SGModelPlacement::setPosition(const SGGeod& position)
110 _position = position;
114 SGModelPlacement::setRollDeg (double roll_deg)
116 _roll_deg = roll_deg;
120 SGModelPlacement::setPitchDeg (double pitch_deg)
122 _pitch_deg = pitch_deg;
126 SGModelPlacement::setHeadingDeg (double heading_deg)
128 _heading_deg = heading_deg;
132 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
135 _roll_deg = roll_deg;
136 _pitch_deg = pitch_deg;
137 _heading_deg = heading_deg;
141 SGModelPlacement::setOrientation (const SGQuatd& orientation)
143 orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
147 SGModelPlacement::setReferenceTime(const double& referenceTime)
149 SGSceneUserData* userData;
150 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
151 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
152 vel->referenceTime = referenceTime;
156 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
158 SGSceneUserData* userData;
159 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
160 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
161 vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
165 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
167 SGSceneUserData* userData;
168 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
169 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
170 vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);