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/SGSceneUserData.hxx>
16 ////////////////////////////////////////////////////////////////////////
17 // Implementation of SGModelPlacement.
18 ////////////////////////////////////////////////////////////////////////
20 SGModelPlacement::SGModelPlacement () :
21 _position(SGGeod::fromRad(0, 0)),
25 _selector(new osg::Switch),
26 _transform(new osg::PositionAttitudeTransform)
30 SGModelPlacement::~SGModelPlacement ()
35 SGModelPlacement::init( osg::Node * model )
38 _transform->addChild(model);
40 _selector->addChild(_transform.get());
41 _selector->setValue(0, 1);
45 SGModelPlacement::update()
47 // The cartesian position
48 SGVec3d position = SGVec3d::fromGeod(_position);
49 _transform->setPosition(toOsg(position));
51 // The orientation, composed from the horizontal local orientation and the
52 // orientation wrt the horizontal local frame
53 SGQuatd orient = SGQuatd::fromLonLat(_position);
54 orient *= SGQuatd::fromYawPitchRollDeg(_heading_deg, _pitch_deg, _roll_deg);
55 // Convert to the scenegraph orientation where we just rotate around
56 // the y axis 180 degrees.
57 orient *= SGQuatd::fromRealImag(0, SGVec3d(0, 1, 0));
59 _transform->setAttitude(toOsg(orient));
63 SGModelPlacement::getVisible () const
65 return _selector->getValue(0);
69 SGModelPlacement::setVisible (bool visible)
71 _selector->setValue(0, visible);
75 SGModelPlacement::setLongitudeDeg (double lon_deg)
77 _position.setLongitudeDeg(lon_deg);
81 SGModelPlacement::setLatitudeDeg (double lat_deg)
83 _position.setLatitudeDeg(lat_deg);
87 SGModelPlacement::setElevationFt (double elev_ft)
89 _position.setElevationFt(elev_ft);
93 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
95 _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
99 SGModelPlacement::setPosition(const SGGeod& position)
101 _position = position;
105 SGModelPlacement::setRollDeg (double roll_deg)
107 _roll_deg = roll_deg;
111 SGModelPlacement::setPitchDeg (double pitch_deg)
113 _pitch_deg = pitch_deg;
117 SGModelPlacement::setHeadingDeg (double heading_deg)
119 _heading_deg = heading_deg;
123 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
126 _roll_deg = roll_deg;
127 _pitch_deg = pitch_deg;
128 _heading_deg = heading_deg;
132 SGModelPlacement::setOrientation (const SGQuatd& orientation)
134 orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
138 SGModelPlacement::setReferenceTime(const double& referenceTime)
140 SGSceneUserData* userData;
141 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
142 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
143 vel->referenceTime = referenceTime;
147 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
149 SGSceneUserData* userData;
150 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
151 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
152 vel->linear = SGVec3d(-linear[0], linear[1], -linear[2]);
156 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
158 SGSceneUserData* userData;
159 userData = SGSceneUserData::getOrCreateSceneUserData(_transform.get());
160 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
161 vel->angular = SGVec3d(-angular[0], angular[1], -angular[2]);