24 #include "manipulatedCameraFrame.h"
25 #include "qglviewer.h"
27 #include <QMouseEvent>
29 using namespace qglviewer;
38 : driveSpeed_(0.0), sceneUpVector_(0.0, 1.0, 0.0), rotatesAroundUpVector_(false), zoomsOnPivotPoint_(false)
42 connect(&flyTimer_, SIGNAL(timeout()), SLOT(flyUpdate()));
63 connect(&flyTimer_, SIGNAL(timeout()), SLOT(flyUpdate()));
80 void ManipulatedCameraFrame::flyUpdate()
82 static Vec flyDisp(0.0, 0.0, 0.0);
85 case QGLViewer::MOVE_FORWARD:
89 case QGLViewer::MOVE_BACKWARD:
93 case QGLViewer::DRIVE:
94 flyDisp.z =
flySpeed() * driveSpeed_;
106 Vec ManipulatedCameraFrame::flyUpVector()
const {
107 qWarning(
"flyUpVector() is deprecated. Use sceneUpVector() instead.");
111 void ManipulatedCameraFrame::setFlyUpVector(
const Vec& up) {
112 qWarning(
"setFlyUpVector() is deprecated. Use setSceneUpVector() instead.");
120 void ManipulatedCameraFrame::updateSceneUpVector()
145 QDomElement mcp = document.createElement(
"ManipulatedCameraParameters");
146 mcp.setAttribute(
"flySpeed", QString::number(
flySpeed()));
165 QDomElement child=element.firstChild().toElement();
166 while (!child.isNull())
168 if (child.tagName() ==
"ManipulatedCameraParameters")
174 QDomElement schild=child.firstChild().toElement();
175 while (!schild.isNull())
177 if (schild.tagName() ==
"sceneUpVector")
180 schild = schild.nextSibling().toElement();
183 child = child.nextSibling().toElement();
200 case QGLViewer::MOVE_FORWARD:
201 case QGLViewer::MOVE_BACKWARD:
202 case QGLViewer::DRIVE:
203 flyTimer_.setSingleShot(
false);
206 case QGLViewer::ROTATE:
207 constrainedRotationIsReversed_ =
transformOf(sceneUpVector_).y < 0.0;
214 void ManipulatedCameraFrame::zoom(
float delta,
const Camera *
const camera) {
216 if (zoomsOnPivotPoint_) {
218 if (direction.
norm() > 0.02f * sceneRadius || delta > 0.0f)
222 Vec trans(0.0, 0.0, -coef * delta);
238 case QGLViewer::TRANSLATE:
240 const QPoint delta = prevPos_ -
event->pos();
241 Vec trans(static_cast<float>(delta.x()), static_cast<float>(-delta.y()), 0.0);
243 switch (camera->
type())
245 case Camera::PERSPECTIVE :
249 case Camera::ORTHOGRAPHIC :
262 case QGLViewer::MOVE_FORWARD:
264 Quaternion rot = pitchYawQuaternion(event->x(),
event->y(), camera);
272 case QGLViewer::MOVE_BACKWARD:
274 Quaternion rot = pitchYawQuaternion(event->x(),
event->y(), camera);
281 case QGLViewer::DRIVE:
283 Quaternion rot = turnQuaternion(event->x(), camera);
286 driveSpeed_ = 0.01 * (
event->y() - pressPos_.y());
290 case QGLViewer::ZOOM:
296 case QGLViewer::LOOK_AROUND:
298 Quaternion rot = pitchYawQuaternion(event->x(),
event->y(), camera);
303 case QGLViewer::ROTATE:
306 if (rotatesAroundUpVector_) {
310 if (constrainedRotationIsReversed_) dx = -dx;
324 case QGLViewer::SCREEN_ROTATE:
328 const float angle = atan2(event->y() - trans[1],
event->x() - trans[0]) - atan2(prevPos_.y()-trans[1], prevPos_.x()-trans[0]);
335 updateSceneUpVector();
339 case QGLViewer::ROLL:
341 const float angle = M_PI * (
event->x() - prevPos_.x()) / camera->
screenWidth();
345 updateSceneUpVector();
349 case QGLViewer::SCREEN_TRANSLATE:
354 trans.
setValue(static_cast<float>(prevPos_.x() -
event->x()), 0.0, 0.0);
356 trans.
setValue(0.0, static_cast<float>(event->y() - prevPos_.y()), 0.0);
358 switch (camera->
type())
360 case Camera::PERSPECTIVE :
364 case Camera::ORTHOGRAPHIC :
378 case QGLViewer::ZOOM_ON_REGION:
379 case QGLViewer::NO_MOUSE_ACTION:
383 if (action_ != QGLViewer::NO_MOUSE_ACTION)
385 prevPos_ =
event->pos();
386 if (action_ != QGLViewer::ZOOM_ON_REGION)
398 if ((action_ == QGLViewer::MOVE_FORWARD) || (action_ == QGLViewer::MOVE_BACKWARD) || (action_ == QGLViewer::DRIVE))
401 if (action_ == QGLViewer::ZOOM_ON_REGION)
418 case QGLViewer::ZOOM:
424 case QGLViewer::MOVE_FORWARD:
425 case QGLViewer::MOVE_BACKWARD:
435 if (previousConstraint_)
442 const int finalDrawAfterWheelEventDelay = 400;
445 flyTimer_.setSingleShot(
true);
446 flyTimer_.start(finalDrawAfterWheelEventDelay);
451 action_ = QGLViewer::NO_MOUSE_ACTION;
457 Quaternion ManipulatedCameraFrame::turnQuaternion(
int x,
const Camera*
const camera)
464 Quaternion ManipulatedCameraFrame::pitchYawQuaternion(
int x,
int y,
const Camera*
const camera)