本文主要是介绍assimp中如何判断矩阵是否是单位矩阵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
对于一个矩阵元素为浮点型的矩阵,你是否还在使每个元素跟1.0f或0.0f进行比较,如果这样,只能说你的结果不一定正确,那我们看看assimp中是如何做的。
template <typename TReal>
AI_FORCE_INLINE
bool aiMatrix4x4t<TReal>::IsIdentity() const {// Use a small epsilon to solve floating-point inaccuraciesconst static TReal epsilon = 10e-3f;return (a2 <= epsilon && a2 >= -epsilon &&a3 <= epsilon && a3 >= -epsilon &&a4 <= epsilon && a4 >= -epsilon &&b1 <= epsilon && b1 >= -epsilon &&b3 <= epsilon && b3 >= -epsilon &&b4 <= epsilon && b4 >= -epsilon &&c1 <= epsilon && c1 >= -epsilon &&c2 <= epsilon && c2 >= -epsilon &&c4 <= epsilon && c4 >= -epsilon &&d1 <= epsilon && d1 >= -epsilon &&d2 <= epsilon && d2 >= -epsilon &&d3 <= epsilon && d3 >= -epsilon &&a1 <= 1.f+epsilon && a1 >= 1.f-epsilon &&b2 <= 1.f+epsilon && b2 >= 1.f-epsilon &&c3 <= 1.f+epsilon && c3 >= 1.f-epsilon &&d4 <= 1.f+epsilon && d4 >= 1.f-epsilon);
}
这里是定义了一个模板函数,对于矩阵元素为整型和浮点型都是可行的。
需要引起我们注意的是极小值epsilon的定义:
const static TReal epsilon = 10e-3f;
还有双向比较:
a2 <= epsilon && a2 >= -epsilon
a1 <= 1.f+epsilon && a1 >= 1.f-epsilon
从而保证了元素值为0.0f或1.0f。
这篇关于assimp中如何判断矩阵是否是单位矩阵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!