Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Ethan Alexander Shulman 2019
- //Converts OpenVR rotation matrix to quaternion with coordinate system +x,+y,+z
- void mat2quat(HmdMatrix34_t m, float *q) {
- float rt = m.m[0][0] + m.m[1][1] + m.m[2][2];
- if (rt > 0.0f) {
- const float s = sqrtf(rt + 1.0f), b = 0.5f / s;
- q[0] = (m.m[1][2]-m.m[2][1])*b;
- q[1] = (m.m[2][0] - m.m[0][2])*b;
- q[2] = (m.m[0][1] - m.m[1][0])*-b;
- q[3] = s*0.5f;
- }
- else if (m.m[0][0] > m.m[1][1] && m.m[0][0] > m.m[2][2]) {
- const float s = sqrtf(1.0f + m.m[0][0] - m.m[1][1] - m.m[2][2]), b = 0.5f / s;
- q[0] = s*0.5f;
- q[1] = (m.m[1][0] + m.m[0][1])*b;
- q[2] = (m.m[2][0] + m.m[0][2])*-b;
- q[3] = (m.m[1][2] - m.m[2][1])*b;
- }
- else if (m.m[1][1] > m.m[2][2]) {
- const float s = sqrtf(1.0f + m.m[1][1] - m.m[0][0] - m.m[2][2]), b = 0.5f / s;
- q[0] = (m.m[0][1] + m.m[1][0])*b;
- q[1] = s*0.5f;
- q[2] = (m.m[1][2] + m.m[2][1])*-b;
- q[3] = (m.m[0][2] - m.m[2][0])*-b;
- } else {
- const float s = sqrtf(1.0f + m.m[2][2] - m.m[0][0] - m.m[1][1]), b = 0.5f / s;
- q[0] = (m.m[0][2] + m.m[2][0])*-b;
- q[1] = (m.m[1][2] + m.m[2][1])*-b;
- q[2] = s*0.5f;
- q[3] = (m.m[1][0] - m.m[0][1])*b;
- }
- }
- ```
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement