carboncomputed
carboncomputed

Reputation: 1620

How do you derive a rotation matrix from yaw, pitch and roll with OpenGL?

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

Answers (1)

carboncomputed
carboncomputed

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

Related Questions