diff options
author | Rainer Keller <rainer.keller@nokia.com> | 2011-02-03 15:47:09 +0000 |
---|---|---|
committer | Rainer Keller <rainer.keller@nokia.com> | 2011-02-04 11:26:13 +0000 |
commit | 7f8aae5eb702ee19a8725693ed2c3527f7b4aa9c (patch) | |
tree | 0eec1f878a667447a288c8f3452b4a5ab3c0554e | |
parent | 837c7195cb8c4ae78bd98ef6cdd3bdc6ddb37430 (diff) |
Fix 3d accelerometer control.
Done-with: ckamm
-rw-r--r-- | src/ui/accelerometercontrol.cpp | 37 | ||||
-rw-r--r-- | src/ui/accelerometercontrol.h | 3 |
2 files changed, 28 insertions, 12 deletions
diff --git a/src/ui/accelerometercontrol.cpp b/src/ui/accelerometercontrol.cpp index 3dd2295..3f5ea8f 100644 --- a/src/ui/accelerometercontrol.cpp +++ b/src/ui/accelerometercontrol.cpp @@ -36,28 +36,33 @@ #include <QtGui/QMatrix4x4> #include <QtGui/QMouseEvent> +static QVector3D accelerometerX(-1, 0, 0); +static QVector3D accelerometerY(0, 1, 0); +static QVector3D accelerometerZ(0, 0, -1); +static QVector3D unrotatedGravity(0, 1, 0); + AccelerometerControl::AccelerometerControl(QWidget *parent) - : QGLWidget(parent) + : QGLWidget(parent), mGravity(9.8) { } -void AccelerometerControl::setValue(const QVector3D &value) +void AccelerometerControl::setValue(const QVector3D &newValue) { - QVector3D up(0, 1, 0); - QVector3D target = value.normalized(); + mGravity = newValue.length(); + QVector3D target = newValue.normalized(); + + if ((newValue - value()).lengthSquared() < 0.0001) + return; - qreal dot = QVector3D::dotProduct(up, target); + qreal dot = QVector3D::dotProduct(accelerometerY, target); if (dot > 0.999) { mRotation = QQuaternion(); - mUpValue = value; } else if(dot < -0.999) { mRotation = QQuaternion::fromAxisAndAngle(0, 0, 1, 180); - mUpValue = -value; } else { // we want the quaternion that transforms target into up - QVector3D cross = QVector3D::crossProduct(target, up); + QVector3D cross = QVector3D::crossProduct(target, accelerometerY); mRotation = QQuaternion::fromAxisAndAngle(cross, qAcos(dot) * 180 / M_PI); - mUpValue = mRotation.rotatedVector(value); } updateGL(); @@ -263,8 +268,7 @@ void AccelerometerControl::mouseMoveEvent(QMouseEvent *event) } mOldMousePosition = event->pos(); - QVector3D newValue = mRotation.conjugate().rotatedVector(mUpValue); - emit valueChanged(newValue); + emit valueChanged(value()); updateGL(); } @@ -293,3 +297,14 @@ void AccelerometerControl::setDeviceOrientation(bool portrait) } updateGL(); } + +QVector3D AccelerometerControl::value() const +{ + QVector3D newValue; + newValue.setX(QVector3D::dotProduct(mRotation.conjugate().rotatedVector(accelerometerX), unrotatedGravity)); + newValue.setY(QVector3D::dotProduct(mRotation.conjugate().rotatedVector(accelerometerY), unrotatedGravity)); + newValue.setZ(QVector3D::dotProduct(mRotation.conjugate().rotatedVector(accelerometerZ), unrotatedGravity)); + newValue *= mGravity; + + return newValue; +} diff --git a/src/ui/accelerometercontrol.h b/src/ui/accelerometercontrol.h index 199aab0..ff0631c 100644 --- a/src/ui/accelerometercontrol.h +++ b/src/ui/accelerometercontrol.h @@ -42,6 +42,7 @@ public: void setDeviceOrientation(bool portrait); + QVector3D value() const; signals: void valueChanged(const QVector3D &value); @@ -62,7 +63,7 @@ private: private: QPoint mOldMousePosition; QQuaternion mRotation; - QVector3D mUpValue; + qreal mGravity; bool mDefaultPortrait; GLuint mFrontTexture; |