summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Mathias Agopian <mathias@google.com> 2010-11-22 01:04:09 -0800
committer Mathias Agopian <mathias@google.com> 2010-11-22 01:04:09 -0800
commit5d45c33eb875b9c9d51c9364afa57a0be65adfa4 (patch)
tree2255ae16dc5bca996daf07e2ed684d177e4f4e1f
parent805bddc123c1fc56be333d6ff365f168d4bc2b08 (diff)
don't attempt to normalize the rotation vector
indeed, by construction of the rotation matrix, it is guaranteed to have a length of 1. moreover, the normalization code was missing a square-root, fortunatelly, since the length is 1, this didn't cause any damage (since sqrt(1) = 1). Change-Id: I9facd668caaf5bb3bfccb139ab872f2bb2066365
-rw-r--r--services/sensorservice/RotationVectorSensor.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/services/sensorservice/RotationVectorSensor.cpp b/services/sensorservice/RotationVectorSensor.cpp
index 6f4b8be45fde..eecf260a7724 100644
--- a/services/sensorservice/RotationVectorSensor.cpp
+++ b/services/sensorservice/RotationVectorSensor.cpp
@@ -114,10 +114,12 @@ bool RotationVectorSensor::process(sensors_event_t* outEvent,
float qx = sqrtf( clamp( Hx - My - Az + 1) * 0.25f );
float qy = sqrtf( clamp(-Hx + My - Az + 1) * 0.25f );
float qz = sqrtf( clamp(-Hx - My + Az + 1) * 0.25f );
- const float n = 1.0f / (qw*qw + qx*qx + qy*qy + qz*qz);
- qx = copysignf(qx, Ay - Mz) * n;
- qy = copysignf(qy, Hz - Ax) * n;
- qz = copysignf(qz, Mx - Hy) * n;
+ qx = copysignf(qx, Ay - Mz);
+ qy = copysignf(qy, Hz - Ax);
+ qz = copysignf(qz, Mx - Hy);
+
+ // this quaternion is guaranteed to be normalized, by construction
+ // of the rotation matrix.
*outEvent = event;
outEvent->data[0] = qx;