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);
48 SGModelPlacement::update()
50 // The cartesian position
51 SGVec3d position = SGVec3d::fromGeod(_position);
52 _transform->setPosition(toOsg(position));
54 // The orientation, composed from the horizontal local orientation and the
55 // orientation wrt the horizontal local frame
56 SGQuatd orient = SGQuatd::fromLonLat(_position);
57 orient *= SGQuatd::fromYawPitchRollDeg(_heading_deg, _pitch_deg, _roll_deg);
58 // Convert to the scenegraph orientation where we just rotate around
59 // the y axis 180 degrees.
60 orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
62 _transform->setAttitude(toOsg(orient));
66 SGModelPlacement::getVisible () const
68 return _selector->getValue(0);
72 SGModelPlacement::setVisible (bool visible)
74 _selector->setValue(0, visible);
78 SGModelPlacement::setLongitudeDeg (double lon_deg)
80 _position.setLongitudeDeg(lon_deg);
84 SGModelPlacement::setLatitudeDeg (double lat_deg)
86 _position.setLatitudeDeg(lat_deg);
90 SGModelPlacement::setElevationFt (double elev_ft)
92 _position.setElevationFt(elev_ft);
96 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
98 _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
102 SGModelPlacement::setPosition(const SGGeod& position)
104 _position = position;
108 SGModelPlacement::setRollDeg (double roll_deg)
110 _roll_deg = roll_deg;
114 SGModelPlacement::setPitchDeg (double pitch_deg)
116 _pitch_deg = pitch_deg;
120 SGModelPlacement::setHeadingDeg (double heading_deg)
122 _heading_deg = heading_deg;
126 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
129 _roll_deg = roll_deg;
130 _pitch_deg = pitch_deg;
131 _heading_deg = heading_deg;
135 SGModelPlacement::setOrientation (const SGQuatd& orientation)
137 orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
141 SGModelPlacement::setReferenceTime(const double& referenceTime)
143 SGSceneUserData* userData;
144 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
145 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
146 vel->referenceTime = referenceTime;
150 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
152 SGSceneUserData* userData;
153 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
154 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
155 vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
159 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
161 SGSceneUserData* userData;
162 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
163 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
164 vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);