summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRainer Keller <rainer.keller@nokia.com>2011-02-03 15:47:09 +0000
committerRainer Keller <rainer.keller@nokia.com>2011-02-04 11:26:13 +0000
commit7f8aae5eb702ee19a8725693ed2c3527f7b4aa9c (patch)
tree0eec1f878a667447a288c8f3452b4a5ab3c0554e
parent837c7195cb8c4ae78bd98ef6cdd3bdc6ddb37430 (diff)
Fix 3d accelerometer control.
Done-with: ckamm
-rw-r--r--src/ui/accelerometercontrol.cpp37
-rw-r--r--src/ui/accelerometercontrol.h3
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;