浏览代码

Merge pull request #1019 from dscharrer/master

Fix singularity in quaternion to euler angle roll conversion #1019
Christophe 5 年之前
父节点
当前提交
b033c73b42
共有 1 个文件被更改,包括 7 次插入1 次删除
  1. 7 1
      glm/gtc/quaternion.inl

+ 7 - 1
glm/gtc/quaternion.inl

@@ -15,7 +15,13 @@ namespace glm
 	template<typename T, qualifier Q>
 	GLM_FUNC_QUALIFIER T roll(qua<T, Q> const& q)
 	{
-		return static_cast<T>(atan(static_cast<T>(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z));
+		T const y = static_cast<T>(2) * (q.x * q.y + q.w * q.z);
+		T const x = q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z;
+
+		if(all(equal(vec<2, T, Q>(x, y), vec<2, T, Q>(0), epsilon<T>()))) //avoid atan2(0,0) - handle singularity - Matiis
+			return static_cast<T>(0);
+
+		return static_cast<T>(atan(y, x));
 	}
 
 	template<typename T, qualifier Q>