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 () :
26 _position(SGGeod::fromRad(0, 0)),
30 _selector(new osg::Switch),
31 _transform(new SGPlacementTransform),
32 _location(new SGLocation)
36 SGModelPlacement::~SGModelPlacement ()
42 SGModelPlacement::init( osg::Node * model )
45 _transform->addChild(model);
47 _selector->addChild(_transform.get());
48 _selector->setValue(0, 1);
52 SGModelPlacement::update()
54 _location->setPosition( _position.getLongitudeDeg(),
55 _position.getLatitudeDeg(),
56 _position.getElevationFt() );
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 _transform->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)
83 _position.setLongitudeDeg(lon_deg);
87 SGModelPlacement::setLatitudeDeg (double lat_deg)
89 _position.setLatitudeDeg(lat_deg);
93 SGModelPlacement::setElevationFt (double elev_ft)
95 _position.setElevationFt(elev_ft);
99 SGModelPlacement::setPosition (double lon_deg, double lat_deg, double elev_ft)
101 _position = SGGeod::fromDegFt(lon_deg, lat_deg, elev_ft);
105 SGModelPlacement::setPosition(const SGGeod& position)
107 _position = position;
111 SGModelPlacement::setRollDeg (double roll_deg)
113 _roll_deg = roll_deg;
117 SGModelPlacement::setPitchDeg (double pitch_deg)
119 _pitch_deg = pitch_deg;
123 SGModelPlacement::setHeadingDeg (double heading_deg)
125 _heading_deg = heading_deg;
129 SGModelPlacement::setOrientation (double roll_deg, double pitch_deg,
132 _roll_deg = roll_deg;
133 _pitch_deg = pitch_deg;
134 _heading_deg = heading_deg;
138 SGModelPlacement::setOrientation (const SGQuatd& orientation)
140 orientation.getEulerDeg(_heading_deg, _pitch_deg, _roll_deg);
144 SGModelPlacement::setBodyLinearVelocity(const SGVec3d& linear)
146 SGSceneUserData* userData;
147 userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
148 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
149 SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
150 vel->linear = orientation.backTransform(linear);
154 SGModelPlacement::setBodyAngularVelocity(const SGVec3d& angular)
156 SGSceneUserData* userData;
157 userData = SGSceneUserData::getOrCreateSceneUserData(_transform);
158 SGSceneUserData::Velocity* vel = userData->getOrCreateVelocity();
159 SGQuatd orientation = SGQuatd::fromAngleAxisDeg(180, SGVec3d(0, 1, 0));
160 vel->angular = orientation.backTransform(angular);