public void SolveShoulderToArmInternal( int i, ref Vector3 destArmPos )
{
if( !settings.bodyIK.shoulderSolveEnabled ) {
return;
}
Bone[] shoulderBones = _solverCaches.shoulderBones;
float[] shoulderToArmLength = _solverCaches.shoulderToArmLength;
float limitYPlus = internalValues.bodyIK.shoulderLimitThetaYPlus.sin;
float limitYMinus = internalValues.bodyIK.shoulderLimitThetaYMinus.sin;
float limitZ = internalValues.bodyIK.shoulderLimitThetaZ.sin;
if( shoulderBones == null ) {
return;
}
if( _shouderLocalAxisYInv[i] ) {
float t = limitYPlus;
limitYPlus = limitYMinus;
limitYMinus = t;
}
if( !IsFuzzy( ref armPos[i], ref destArmPos ) ) {
Vector3 dirX = destArmPos - this.shoulderPos[i];
if( SAFBIKVecNormalize( ref dirX ) ) {
if( settings.bodyIK.shoulderLimitEnabled ) {
Matrix3x3 worldBasis = this.spineUBasis;
SAFBIKMatMultRet0( ref worldBasis, ref shoulderBones[i]._localAxisBasis );
SAFBIKMatMultVecInv( out dirX, ref worldBasis, ref dirX );
_LimitYZ_Square( i != 0, ref dirX, limitYMinus, limitYPlus, limitZ, limitZ );
SAFBIKMatMultVec( out dirX, ref worldBasis, ref dirX );
}
this.armPos[i] = this.shoulderPos[i] + dirX * shoulderToArmLength[i];
}
}
}
}