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>
14 #include "placementtrans.hxx"
16 #include "placement.hxx"
20 ////////////////////////////////////////////////////////////////////////
21 // Implementation of SGModelPlacement.
22 ////////////////////////////////////////////////////////////////////////
24 SGModelPlacement::SGModelPlacement () :
25 _position(SGGeod::fromRad(0, 0)),
29 _selector(new osg::Switch),
30 _transform(new SGPlacementTransform)
34 SGModelPlacement::~SGModelPlacement ()
39 SGModelPlacement::init( osg::Node * model )
42 _transform->addChild(model);
44 _selector->addChild(_transform.get());
45 _selector->setValue(0, 1);
49 SGModelPlacement::update()
51 // The cartesian position
52 SGVec3d position = SGVec3d::fromGeod(_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::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
58 orient *= SGQuatd::fromYawPitchRollDeg(-_heading_deg, _pitch_deg, -_roll_deg);
59 SGMatrixd rotation(inverse(orient));
60 _transform->setTransform(position, rotation);
64 SGModelPlacement::getVisible () const
66 return _selector->getValue(0);
70 SGModelPlacement::setVisible (bool visible)
72 _selector->setValue(0, visible);
76 SGModelPlacement::setLongitudeDeg (double lon_deg)
78 _position.setLongitudeDeg(lon_deg);
82 SGModelPlacement::setLatitudeDeg (double lat_deg)
84 _position.setLatitudeDeg(lat_deg);
88 SGModelPlacement::setElevationFt (double elev_ft)
90 _position.setElevationFt(elev_ft);
94 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
96 _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
100 SGModelPlacement::setPosition(const SGGeod& position)
102 _position = position;
106 SGModelPlacement::setRollDeg (double roll_deg)
108 _roll_deg = roll_deg;
112 SGModelPlacement::setPitchDeg (double pitch_deg)
114 _pitch_deg = pitch_deg;
118 SGModelPlacement::setHeadingDeg (double heading_deg)
120 _heading_deg = heading_deg;
124 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
127 _roll_deg = roll_deg;
128 _pitch_deg = pitch_deg;
129 _heading_deg = heading_deg;
133 SGModelPlacement::setOrientation (const SGQuatd& orientation)
135 orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
139 SGModelPlacement::setReferenceTime(const double& referenceTime)
141 SGSceneUserData* userData;
142 userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
143 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
144 vel->referenceTime = referenceTime;
148 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
150 SGSceneUserData* userData;
151 userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
152 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
153 SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
154 vel->linear = orientation.backTransform(linear);
158 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
160 SGSceneUserData* userData;
161 userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
162 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
163 SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
164 vel->angular = orientation.backTransform(angular);