summaryrefslogtreecommitdiffstats
path: root/src/ui/accelerometercontrol.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/accelerometercontrol.cpp')
-rw-r--r--src/ui/accelerometercontrol.cpp37
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;
+}