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 <simgear/compiler.h>
12 #include <simgear/scene/util/SGSceneUserData.hxx>
13 #include <simgear/scene/util/SGUpdateVisitor.hxx>
15 #include "placement.hxx"
19 ////////////////////////////////////////////////////////////////////////
20 // Implementation of SGModelPlacement.
21 ////////////////////////////////////////////////////////////////////////
23 SGModelPlacement::SGModelPlacement () :
24 _position(SGGeod::fromRad(0, 0)),
28 _selector(new osg::Switch),
29 _transform(new SGPlacementTransform)
33 SGModelPlacement::~SGModelPlacement ()
38 SGModelPlacement::init( osg::Node * model )
41 _transform->addChild(model);
43 _selector->addChild(_transform.get());
44 _selector->setValue(0, 1);
48 SGModelPlacement::update()
50 // The cartesian position
51 SGVec3d position = SGVec3d::fromGeod(_position);
53 // The orientation, composed from the horizontal local orientation and the
54 // orientation wrt the horizontal local frame
55 SGQuatd orient = SGQuatd::fromLonLat(_position);
56 orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
57 orient *= SGQuatd::fromYawPitchRollDeg(-_heading_deg, _pitch_deg, -_roll_deg);
58 _transform->setTransform(position, orient);
62 SGModelPlacement::getVisible () const
64 return _selector->getValue(0);
68 SGModelPlacement::setVisible (bool visible)
70 _selector->setValue(0, visible);
74 SGModelPlacement::setLongitudeDeg (double lon_deg)
76 _position.setLongitudeDeg(lon_deg);
80 SGModelPlacement::setLatitudeDeg (double lat_deg)
82 _position.setLatitudeDeg(lat_deg);
86 SGModelPlacement::setElevationFt (double elev_ft)
88 _position.setElevationFt(elev_ft);
92 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
94 _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
98 SGModelPlacement::setPosition(const SGGeod& position)
100 _position = position;
104 SGModelPlacement::setRollDeg (double roll_deg)
106 _roll_deg = roll_deg;
110 SGModelPlacement::setPitchDeg (double pitch_deg)
112 _pitch_deg = pitch_deg;
116 SGModelPlacement::setHeadingDeg (double heading_deg)
118 _heading_deg = heading_deg;
122 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
125 _roll_deg = roll_deg;
126 _pitch_deg = pitch_deg;
127 _heading_deg = heading_deg;
131 SGModelPlacement::setOrientation (const SGQuatd& orientation)
133 orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
137 SGModelPlacement::setReferenceTime(const double& referenceTime)
139 SGSceneUserData* userData;
140 userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
141 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
142 vel->referenceTime = referenceTime;
146 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
148 SGSceneUserData* userData;
149 userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
150 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
151 vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
155 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
157 SGSceneUserData* userData;
158 userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
159 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
160 vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);