缘由是看到这篇文章:
http://www.cnblogs.com/ixnehc/archive/2010/12/12/1903662.html
主要是这一段话启发了我:
在具体压缩的时候,我们还对不同部分的骨骼的压缩精度作了调整,越靠近根部的骨骼的误差限制会越严格,以避免动作走样,而骨架末端的骨骼(比如手腕,脚腕)则可以放宽限制.
在之前,精度控制固定为:
float
epsilon
=
powf(
0.1f
, static_cast
<
float
>
(config.precision));
//
精度
于是将代码修改成为:
int
depth
=
std::min(
10
, getNodeDepth(pBone));
const float maxPrecision = config.precision - MIN_PRECISION + 1.2f ;
float factor = std::max( 1.0f , maxPrecision * ( 1.0f - 1.0f / depth));
epsilon = powf( 0.1f * factor, static_cast < float > (config.precision)); // 精度
optimizeSkeletal(epsilon, bone.keyFrames);
const float maxPrecision = config.precision - MIN_PRECISION + 1.2f ;
float factor = std::max( 1.0f , maxPrecision * ( 1.0f - 1.0f / depth));
epsilon = powf( 0.1f * factor, static_cast < float > (config.precision)); // 精度
optimizeSkeletal(epsilon, bone.keyFrames);
注:
getNodeDepth是用来取骨骼所在骨架中的深度
maxPrecision用来控制最大变化量
factor控制最后的精度,骨骼深度越大,factor越接近maxPrecision
这样一来,通过观察,maxPrecision = 1.2是个看上去合适的值,动画不会太受影响,最终的skeleton数据可以减少约0.2 - 0.5不等(相比之前)。