Reputation: 1620
I've tried multiple methods but the expected matrix isn't what I want. I want to produce the same rotation matrix given by the attitude, but produce it from the yaw, pitch and roll values. If there's a builtin function I'm not aware of, I would gladly use that.
[self.motionManager startDeviceMotionUpdatesUsingReferenceFrame:CMAttitudeReferenceFrameXTrueNorthZVertical toQueue:[NSOperationQueue currentQueue] withHandler:^ (CMDeviceMotion *motionData, NSError *error) {
CMRotationMatrix r = motionData.attitude.rotationMatrix;
GLKMatrix4 baseModelViewMatrix;
baseModelViewMatrix = GLKMatrix4Make(r.m11, r.m21, r.m31, 0.0f,
r.m12, r.m22, r.m32, 0.0f,
r.m13, r.m23, r.m33, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
GLKMatrix4 baseModelViewMatrix2 = GLKMatrix4Identity;
double yaw = motionData.attitude.yaw;
double pitch = motionData.attitude.pitch;
double roll = motionData.attitude.roll;
baseModelViewMatrix2 = GLKMatrix4RotateZ(baseModelViewMatrix2, roll);
baseModelViewMatrix2 = GLKMatrix4RotateX(baseModelViewMatrix2, pitch);
baseModelViewMatrix2 = GLKMatrix4RotateY(baseModelViewMatrix2, yaw);
//baseModelViewMatrix = GLKMatrix4Transpose(baseModelViewMatrix);
_scene.rotationMatrix = baseModelViewMatrix2;
}];
Upvotes: 1
Views: 1303
Reputation: 1620
I ended up coming up with a solution. I wrote this function.
GLKMatrix4 rotationMatrix(double yaw, double pitch, double roll){
GLKMatrix4 rotationMat = GLKMatrix4Identity;
rotationMat = GLKMatrix4RotateZ(rotationMat, roll);
rotationMat = GLKMatrix4RotateX(rotationMat, pitch);
rotationMat = GLKMatrix4RotateY(rotationMat, yaw);
rotationMat = GLKMatrix4Make(rotationMat.m00, rotationMat.m02, rotationMat.m01, 0.0f,
rotationMat.m20, rotationMat.m22, rotationMat.m21, 0.0f,
rotationMat.m10, rotationMat.m12, rotationMat.m11, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f);
return rotationMat;
}
Upvotes: 1