Newer
Older
/*=====================================================================
QGroundControl Open Source Ground Control Station
(c) 2009, 2010 QGROUNDCONTROL PROJECT <http://www.qgroundcontrol.org>
This file is part of the QGROUNDCONTROL project
QGROUNDCONTROL is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
QGROUNDCONTROL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with QGROUNDCONTROL. If not, see <http://www.gnu.org/licenses/>.
======================================================================*/
/**
* @file
* @brief Definition of the class Q3DWidget.
*
* @author Lionel Heng <hengli@student.ethz.ch>
*
*/
Lionel Heng
committed
#ifndef Q3DWIDGET_H
#define Q3DWIDGET_H
Lionel Heng
committed
#include <osg/LineSegment>
#include <osg/PositionAttitudeTransform>
hengli
committed
#include <osgGA/TrackballManipulator>
Lionel Heng
committed
#include <osgViewer/Viewer>
#include "GCManipulator.h"
hengli
committed
/**
* @brief Definition of the class Q3DWidget.
* The Q3DWidget widget uses the OpenSceneGraph framework to render
* user-defined objects in 3D. The world coordinate system in OSG is defined:
* - x-axis points to the east
* - y-axis points to the north
* - z-axis points upwards
*/
Lionel Heng
committed
class Q3DWidget : public QGLWidget, public osgViewer::Viewer
hengli
committed
/**
* Constructor.
* @param parent Parent widget.
*/
Lionel Heng
committed
Q3DWidget(QWidget* parent = 0);
hengli
committed
/**
* Destructor.
*/
Lionel Heng
committed
virtual ~Q3DWidget();
hengli
committed
/**
* @brief Initializes the widget.
* @param fps Frames per second.
*/
Lionel Heng
committed
void init(float fps);
hengli
committed
/**
* @brief Sets the camera parameters.
* @param minZoomRange Minimum distance from the viewer to the camera.
* @param cameraFov Camera field of view.
* @param minClipRange Distance from the viewer to the near clipping range.
* @param maxClipRange Distance from the viewer to the far clipping range.
*/
Lionel Heng
committed
void setCameraParams(float minZoomRange, float cameraFov,
hengli
committed
float minClipRange, float maxClipRange);
/**
* @brief Moves the camera by [dx,dy,dz].
* @param dx Translation along the x-axis in meters.
* @param dy Translation along the y-axis in meters.
* @param dz Translation along the z-axis in meters.
*/
void moveCamera(float dx, float dy, float dz);
hengli
committed
/**
* @brief Recenters the camera at (x,y,z).
*/
void recenterCamera(float x, float y, float z);
hengli
committed
/**
* @brief Sets up 3D display mode.
*/
void setDisplayMode3D(void);
hengli
committed
/**
* @brief Gets the world 3D coordinates of the cursor.
* The function projects the 2D cursor position to a line in world space
* and returns the intersection of that line and the horizontal plane
* which contains the point (0, 0, z);
* @param cursorX x-coordinate of the cursor.
* @param cursorY y-coordinate of the cursor.
* @param z z-coordinate of the point in the plane.
* @return A pair of values containing the world 3D cursor coordinates.
*/
std::pair<double,double> getGlobalCursorPosition(int32_t cursorX,
int32_t cursorY,
Lionel Heng
committed
protected slots:
hengli
committed
/**
* @brief Updates the widget.
*/
Lionel Heng
committed
void redraw(void);
hengli
committed
/**
* @brief Get base robot geode.
* @return Smart pointer to the geode.
*/
Lionel Heng
committed
osg::ref_ptr<osg::Geode> createRobot(void);
hengli
committed
/**
* @brief Get base HUD geode.
* @return Smart pointer to the geode.
*/
Lionel Heng
committed
osg::ref_ptr<osg::Node> createHUD(void);
hengli
committed
/**
* @brief Get screen x-coordinate of mouse cursor.
* @return screen x-coordinate of mouse cursor.
*/
Lionel Heng
committed
int getMouseX(void);
hengli
committed
/**
* @brief Get screen y-coordinate of mouse cursor.
* @return screen y-coordinate of mouse cursor.
*/
int getMouseY(void);
Lionel Heng
committed
hengli
committed
/**
* @brief Handle widget resize event.
* @param width New width of widget.
* @param height New height of widget.
*/
Lionel Heng
committed
virtual void resizeGL(int width, int height);
hengli
committed
/**
* @brief Handle widget paint event.
*/
Lionel Heng
committed
virtual void paintGL(void);
hengli
committed
/**
* @brief This function is a container for user-defined rendering.
* All code to render objects should be in this function.
*/
virtual void display(void);
/**
* @brief Processes key press events.
* If this handler is reimplemented, it is very important that you call the
* base class implementation.
* @param event Key press event.
*/
Lionel Heng
committed
virtual void keyPressEvent(QKeyEvent* event);
hengli
committed
/**
* @brief Processes key release events.
* If this handler is reimplemented, it is very important that you call the
* base class implementation.
* @param event Key release event.
*/
Lionel Heng
committed
virtual void keyReleaseEvent(QKeyEvent* event);
hengli
committed
/**
* @brief Processes mouse press events.
* If this handler is reimplemented, it is very important that you call the
* base class implementation.
* @param event Mouse press event.
*/
Lionel Heng
committed
virtual void mousePressEvent(QMouseEvent* event);
hengli
committed
/**
* @brief Processes mouse release events.
* If this handler is reimplemented, it is very important that you call the
* base class implementation.
* @param event Mouse release event.
*/
Lionel Heng
committed
virtual void mouseReleaseEvent(QMouseEvent* event);
hengli
committed
/**
* @brief Processes mouse move events.
* If this handler is reimplemented, it is very important that you call the
* base class implementation.
* @param event Mouse move event.
*/
Lionel Heng
committed
virtual void mouseMoveEvent(QMouseEvent* event);
hengli
committed
/**
* @brief Processes mouse wheel events.
* If this handler is reimplemented, it is very important that you call the
* base class implementation.
* @param event Mouse wheel event.
*/
Lionel Heng
committed
virtual void wheelEvent(QWheelEvent* event);
hengli
committed
/**
* @brief Converts radians to degrees.
* @param angle Angle in radians.
* @return angle in degrees.
*/
Lionel Heng
committed
float r2d(float angle);
hengli
committed
/**
* @brief Converts degrees to radians.
* @param angle Angle in degrees.
* @return angle in radians.
*/
Lionel Heng
committed
float d2r(float angle);
hengli
committed
/**
* @brief Converts Qt-defined key to OSG-defined key.
* @param key Qt-defined key.
* @return OSG-defined key.
*/
Lionel Heng
committed
osgGA::GUIEventAdapter::KeySymbol convertKey(int key) const;
hengli
committed
/**
* @brief Computes intersection of line and plane.
* @param plane Vector which represents the plane.
* @param line Line representation.
* @return 3D point which lies at the intersection of the line and plane.
*/
Lionel Heng
committed
bool getPlaneLineIntersection(const osg::Vec4d& plane,
const osg::LineSegment& line,
osg::Vec3d& isect);
hengli
committed
osg::ref_ptr<osg::Group> root; /**< Root node of scene graph. */
Lionel Heng
committed
osg::ref_ptr<osg::Switch> allocentricMap;
osg::ref_ptr<osg::Switch> rollingMap;
osg::ref_ptr<osg::Switch> egocentricMap;
osg::ref_ptr<osg::PositionAttitudeTransform> robotPosition;
osg::ref_ptr<osg::PositionAttitudeTransform> robotAttitude;
hengli
committed
osg::ref_ptr<osg::Geode> hudGeode; /**< A geode which contains renderable HUD objects. */
osg::ref_ptr<osg::Projection> hudProjectionMatrix; /**< An orthographic projection matrix for HUD display. */
hengli
committed
osg::ref_ptr<osgViewer::GraphicsWindowEmbedded> osgGW; /**< A class which manages OSG graphics windows and events. */
osg::ref_ptr<GCManipulator> cameraManipulator; /**< Camera manipulator. */
hengli
committed
QTimer timer; /**< Timer which draws graphics based on specified fps. */
Lionel Heng
committed
struct CameraParams
{
float minZoomRange;
float cameraFov;
float minClipRange;
float maxClipRange;
};
hengli
committed
CameraParams cameraParams; /**< Struct representing camera parameters. */
Lionel Heng
committed
#endif // Q3DWIDGET_H