43 float yaw = euler(0) * Constants::DEGREES_TO_RADIANS;
44 float pitch = euler(1) * Constants::DEGREES_TO_RADIANS;
45 float roll = euler(2) * Constants::DEGREES_TO_RADIANS;
47 float cyaw = cosf(yaw * 0.5F);
48 float syaw = sinf(yaw * 0.5F);
49 float cpitch = cosf(pitch * 0.5F);
50 float spitch = sinf(pitch * 0.5F);
51 float croll = cosf(roll * 0.5F);
52 float sroll = sinf(roll * 0.5F);
54 float qx = cyaw * cpitch * sroll - syaw * spitch * croll;
55 float qy = cyaw * spitch * croll + syaw * cpitch * sroll;
56 float qz = syaw * cpitch * croll - cyaw * spitch * sroll;
57 float qw = cyaw * cpitch * croll + syaw * spitch * sroll;
59 return Vector4f(qx, qy, qz, qw);
70 float yaw = atan2f(2.0F * (qx * qy + qw * qz),
71 powf(qw, 2) + powf(qx, 2) - powf(qy, 2) - powf(qz, 2));
73 float a = -2.0F * (qx * qz - qw * qy);
79 float pitch = asinf(a);
81 float roll = atan2f(2.0F * (qy * qz + qw * qx),
82 powf(qw, 2) - powf(qx, 2) - powf(qy, 2) + powf(qz, 2));
84 return Vector3f(roll, pitch, yaw) * Constants::RADIANS_TO_DEGREES;
99 {(2*(qw*qw + qx*qx)-1), -2*(qx*qy - qw*qz), -2*(qx*qz + qw*qy)},
100 {2*(qx*qy + qw*qz), -(2*(qw*qw + qy*qy)-1), -2*(qy*qz - qw*qx)},
101 {2*(qx*qz - qw*qy), -2*(qy*qz + qw*qx), -(2*(qw*qw + qz*qz)-1)}};
105 angles[1] = std::atan2(R(2, 0), R(0, 0)) * 180.0f / Constants::PI;
109 Vector3f n = R.col(0);
112 Vector3f e = R.col(1);
113 Vector3f temp(0, 1, 0);
115 Vector3f x = temp.transpose().cross(e);
117 float sign = ((x.dot(n) > 0) ? 1.f : (x.dot(n) < 0) ? -1.f : 0.f);
118 float c = sign * x.norm();
119 angles[0] = -std::atan2(c, temp.dot(e)) * 180.0f / Constants::PI;
127 float r11 = rtm(0, 0);
128 float r12 = rtm(0, 1);
129 float r13 = rtm(0, 2);
130 float r21 = rtm(1, 0);
131 float r22 = rtm(1, 1);
132 float r23 = rtm(1, 2);
133 float r31 = rtm(2, 0);
134 float r32 = rtm(2, 1);
135 float r33 = rtm(2, 2);
142 float tr = r11 + r22 + r33;
146 float sqtrp1 = sqrt(1 + tr);
148 qx = (r23 - r32) / (2.0 * sqtrp1);
149 qy = (r31 - r13) / (2.0 * sqtrp1);
150 qz = (r12 - r21) / (2.0 * sqtrp1);
153 else if ((r22 > r11) && (r22 > r33))
155 float sqdip1 = sqrt(r22 - r11 - r33 + 1.0);
160 sqdip1 = 0.5 / sqdip1;
162 qx = (r12 + r21) * sqdip1;
163 qz = (r23 + r32) * sqdip1;
164 qw = (r31 - r13) * sqdip1;
168 float sqdip1 = sqrt(r33 - r11 - r22 + 1.0);
173 sqdip1 = 0.5 / sqdip1;
175 qx = (r31 + r13) * sqdip1;
176 qy = (r23 + r32) * sqdip1;
177 qw = (r12 - r21) * sqdip1;
181 float sqdip1 = sqrt(r11 - r22 - r33 + 1.0);
186 sqdip1 = 0.5 / sqdip1;
188 qy = (r12 + r21) * sqdip1;
189 qz = (r31 + r13) * sqdip1;
190 qw = (r23 - r32) * sqdip1;
193 return Vector4f(qx, qy, qz, qw);
201 q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3],
202 2.0f * (q[0] * q[1] - q[2] * q[3]),
203 2.0f * (q[0] * q[2] + q[1] * q[3]),
206 2.0f * (q[0] * q[1] + q[2] * q[3]),
207 - q[0] * q[0] + q[1] * q[1] - q[2] * q[2] + q[3] * q[3],
208 2.0f * (q[1] * q[2] - q[0] * q[3]),
211 2.0f * (q[0] * q[2] - q[1] * q[3]),
212 2.0f * (q[1] * q[2] + q[0] * q[3]),
213 - q[0] * q[0] - q[1] * q[1] + q[2] * q[2] + q[3] * q[3]