SA.FullBodyIK.BodyIK.SolverInternal.SolveShoulderToArmInternal C# (CSharp) Method

SolveShoulderToArmInternal() public method

public SolveShoulderToArmInternal ( int i, Vector3 &destArmPos ) : void
i int
destArmPos UnityEngine.Vector3
return void
				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];
						}
					}
				}
			}