I made a manual adjustment based on sac.body, it's may not good but I'm satisfied with the results, it doesn't affected by velocity though.

Code:

`Mems<Vec2> tails_angle;`

flt tails_y;

tails_angle[0].x+=AngleDelta(tails_angle[0].x, Angle(skel.bones[sac.body].matrix().z.xz())+PI_2);

tails_angle[0].x-=(1-anim.left_right*2)*anim.straight_strafe*anim.stop_move;

tails_angle[0].y+=AngleDelta(tails_angle[0].y, (tails_y-pos().y));

tails_y =pos().y;

FREP(10)

{

int bone_inx=skel.findBoneI(BONE_TAIL, 0, i);

if(bone_inx>=0)

{

Int body_sign =Sign(skel.skeleton()->bones[sac.body].perp.z);

Flt tail_pitch =tails_angle[i].y*body_sign;

tail_pitch *=1-anim.fly_full_body*anim.fly;

Flt tail_pitch_part=tail_pitch/(i+1)+anim.fly;

Flt tail_roll =(tails_angle[Max(i-1, 0)].x-tails_angle[i].x);

if(i>0) tail_roll+=(1-anim.stop_move)*Sin(Time.time())/(4*(i+1)); // tails move on their own naturally

Clamp(tail_roll , -PI/5 , PI/5);

Clamp(tail_pitch_part, -PI/12, PI/8);

Vec v;

Matrix3 m;

v=skel.root.orn.cross(); if(!v.any())v.x=1; CHS(v.z);

m.setRotate(v, tail_pitch_part*-body_sign).rotateY(tail_roll);

skel.bones[bone_inx].orn*=m;

AdjustValTime(tails_angle[i].x, tails_angle[Max(i-1, 0)].x, 0.0025 /(i+1+anim.stop_move*20000+Max(anim.b_turn_l, anim.b_turn_r)*500));

AdjustValTime(tails_angle[i].y, tails_angle[Max(i-1, 0)].y, 0.000005/(i+1));

}else break;

}