Quaternion vector rotation error. #209

This commit is contained in:
Christophe Riccio 2014-06-12 00:29:56 +02:00
parent ea45a7b966
commit c506b43d49
2 changed files with 15 additions and 4 deletions

View File

@ -302,11 +302,11 @@ namespace detail
detail::tvec3<T, P> const & v detail::tvec3<T, P> const & v
) )
{ {
detail::tvec3<T, P> u(q.x, q.y, q.z); detail::tvec3<T, P> const QuatVector(q.x, q.y, q.z);
detail::tvec3<T, P> uv(glm::cross(u, v) * q.w); detail::tvec3<T, P> const uv(glm::cross(QuatVector, v));
detail::tvec3<T, P> uuv(glm::cross(u, uv)); detail::tvec3<T, P> const uuv(glm::cross(QuatVector, uv));
return v + (uv + uuv) * static_cast<float>(2); return v + ((uv * q.w) + uuv) * static_cast<T>(2);
} }
template <typename T, precision P> template <typename T, precision P>

View File

@ -247,6 +247,16 @@ int test_quat_type()
return 0; return 0;
} }
int test_quat_mul_vec()
{
glm::quat q = glm::angleAxis(glm::pi<float>() * 0.5f, glm::vec3(0, 0, 1));
glm::vec3 v(1, 0, 0);
glm::vec3 u(q * v);
glm::vec3 w(u * q);
return glm::all(glm::epsilonEqual(v, w, 0.01f));
}
int test_quat_ctr() int test_quat_ctr()
{ {
int Error(0); int Error(0);
@ -269,6 +279,7 @@ int main()
int Error(0); int Error(0);
Error += test_quat_ctr(); Error += test_quat_ctr();
Error += test_quat_mul_vec();
Error += test_quat_two_axis_ctr(); Error += test_quat_two_axis_ctr();
Error += test_quat_mul(); Error += test_quat_mul();
Error += test_quat_precision(); Error += test_quat_precision();