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 "location.hxx"
15 #include "placementtrans.hxx"
17 #include "placement.hxx"
21 ////////////////////////////////////////////////////////////////////////
22 // Implementation of SGModelPlacement.
23 ////////////////////////////////////////////////////////////////////////
25 SGModelPlacement::SGModelPlacement ()
32 _selector(new osg::Switch),
33 _position(new SGPlacementTransform),
34 _location(new SGLocation)
38 SGModelPlacement::~SGModelPlacement ()
44 SGModelPlacement::init( osg::Node * model )
47 _position->addChild(model);
49 _selector->addChild(_position.get());
50 _selector->setValue(0, 1);
54 SGModelPlacement::update()
56 _location->setPosition( _lon_deg, _lat_deg, _elev_ft );
57 _location->setOrientation( _roll_deg, _pitch_deg, _heading_deg );
59 const sgVec4 *t = _location->getTransformMatrix();
61 for (unsigned i = 0; i < 4; ++i)
62 for (unsigned j = 0; j < 4; ++j)
63 rotation(i, j) = t[j][i];
64 SGVec3d pos(_location->get_absolute_view_pos());
65 _position->setTransform(pos, rotation);
69 SGModelPlacement::getVisible () const
71 return _selector->getValue(0);
75 SGModelPlacement::setVisible (bool visible)
77 _selector->setValue(0, visible);
81 SGModelPlacement::setLongitudeDeg (double lon_deg)
87 SGModelPlacement::setLatitudeDeg (double lat_deg)
93 SGModelPlacement::setElevationFt (double elev_ft)
99 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
107 SGModelPlacement::setPosition(const SGGeod& position)
109 _lon_deg = position.getLongitudeDeg();
110 _lat_deg = position.getLatitudeDeg();
111 _elev_ft = position.getElevationFt();
115 SGModelPlacement::setRollDeg (double roll_deg)
117 _roll_deg = roll_deg;
121 SGModelPlacement::setPitchDeg (double pitch_deg)
123 _pitch_deg = pitch_deg;
127 SGModelPlacement::setHeadingDeg (double heading_deg)
129 _heading_deg = heading_deg;
133 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
136 _roll_deg = roll_deg;
137 _pitch_deg = pitch_deg;
138 _heading_deg = heading_deg;
142 SGModelPlacement::setOrientation (const SGQuatd& orientation)
144 orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
148 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
150 SGSceneUserData* userData;
151 userData = SGSceneUserData::getOrCreateSceneUserData(_position);
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(_position);
162 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
163 SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
164 vel->angular = orientation.backTransform(angular);