GodZza

导航

KlayGE bug report

在文件 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的限制?为何要这样设计?谢谢~

posted on 2013-01-07 17:16  GodZza  阅读(198)  评论(1编辑  收藏  举报