在文件 KlayGE\Core\Include\KlayGE\Math.hpp 数学函数库中发现了mirror函数的Bug.
例如调用: mirror( -10, 1, 2) 会出现死循环.(注意rang 未有使用过)
还有就是 mirror函数和warp函数都使用了while循环, 当val与low和 high的差距比较大时,效率会降低.
warp函数可以使用代替:
template <typename T>
inline T warp(T const & val, T const & len)
{
return val - (floor(val / len) * len);
}
template <typename T>
inline T warp(T const & val, T const & low, T const & high)
{
return warp(val-low,high-low) + low;
}
因为未有对原mirror函数进行测试,所以下面代替有可能不符合原函数要求.
template <typename T>
inline T mirror(T const & val, T const & len)
{
return (len - (abs(warp(val,len * 2) - len)));
}
template <typename T>
inline T mirror(T const & val, T const & low, T const & high)
{
return mirror(val-low,high-low) + low;
}
[注: 两函数参考自Unity3D API. 只测试过float.]
还有一个问题请教下:
template <typename T>
T lerp(T const & lhs, T const & rhs, float s)
{
return lhs + (rhs - lhs) * s;
}
大多数引擎的 Lerp 函数都对参数s使用了从0到1的限制,你这样设计是为了快速(but unsafe)还是要求从调用者自己使用0~1的限制?为何要这样设计?谢谢~