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
This commit is contained in:
Mathias Agopian 2010-11-22 01:04:09 -08:00
parent f001c92436
commit 5c6d7ff3e6
1 changed files with 6 additions and 4 deletions

View File

@ -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;