骨骼数据的进一步优化
缘由是看到这篇文章:
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不等(相比之前)。