diff options
Diffstat (limited to 'src/ui/accelerometercontrol.cpp')
-rw-r--r-- | src/ui/accelerometercontrol.cpp | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/src/ui/accelerometercontrol.cpp b/src/ui/accelerometercontrol.cpp index 03ed36a..d4656f6 100644 --- a/src/ui/accelerometercontrol.cpp +++ b/src/ui/accelerometercontrol.cpp @@ -40,28 +40,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; +} |