骨骼数据的进一步优化

时间:2022-11-03 09:45:42

缘由是看到这篇文章:

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);

 

注:

getNodeDepth是用来取骨骼所在骨架中的深度

maxPrecision用来控制最大变化量

factor控制最后的精度,骨骼深度越大,factor越接近maxPrecision 

 

这样一来,通过观察,maxPrecision = 1.2是个看上去合适的值,动画不会太受影响,最终的skeleton数据可以减少约0.2 - 0.5不等(相比之前)。