Ejemplo n.º 1
0
    private void Solve(AnimationStream stream)
    {
        AnimationHumanStream humanStream = stream.AsHuman();

        Vector3 bodyPosition      = humanStream.bodyPosition;
        Vector3 bodyPositionDelta = Vector3.zero;
        float   sumWeight         = 0;

        for (int goalIter = 0; goalIter < 4; goalIter++)
        {
            float weight = humanStream.GetGoalWeightPosition((AvatarIKGoal)goalIter);
            weight             = Mathf.Clamp01(weight);
            bodyPositionDelta += (humanStream.GetGoalPosition((AvatarIKGoal)goalIter) - humanStream.GetGoalPositionFromPose((AvatarIKGoal)goalIter)) * weight;
            sumWeight         += weight;
        }

        if (sumWeight > 1)
        {
            bodyPositionDelta /= sumWeight;
        }

        bodyPosition            += bodyPositionDelta;
        humanStream.bodyPosition = bodyPosition;

        if (bodyEffector.body.IsValid(stream))
        {
            bodyEffector.body.SetPosition(stream, bodyPosition);
        }

        humanStream.SolveIK();
    }
Ejemplo n.º 2
0
    private void PrepareSolvePull(AnimationStream stream, NativeArray <LimbPart> limbParts)
    {
        AnimationHumanStream humanStream = stream.AsHuman();

        Vector3 bodyPosition = humanStream.bodyPosition;

        for (int goalIter = 0; goalIter < 4; goalIter++)
        {
            var     effector   = GetEffectorHandle((AvatarIKGoal)goalIter);
            var     limbHandle = GetIKLimbHandle((AvatarIKGoal)goalIter);
            Vector3 top        = limbHandle.top.GetPosition(stream);

            limbParts[goalIter] = new LimbPart {
                localPosition    = top - bodyPosition,
                goalPosition     = humanStream.GetGoalPosition((AvatarIKGoal)goalIter),
                goalWeight       = humanStream.GetGoalWeightPosition((AvatarIKGoal)goalIter),
                goalPullWeight   = effector.pullWeight.GetFloat(stream),
                maximumExtension = limbHandle.maximumExtension,
                stiffness        = stiffness
            };
        }
    }
        private void ApplyLimbData(AnimationHumanStream stream, IKLimbData.JobData data, AvatarIKGoal goal, AvatarIKHint hint)
        {
            if (data.positionWeight > 0)
            {
                if (data.positionWeight >= 1)
                {
                    stream.SetGoalPosition(goal, data.position);
                    stream.SetGoalWeightPosition(goal, 1f);
                }
                else
                {
                    var position       = Vector3.Lerp(stream.GetGoalPosition(goal), data.position, data.positionWeight);
                    var positionWeight = Mathf.Lerp(stream.GetGoalWeightPosition(goal), 1f, data.positionWeight);

                    stream.SetGoalPosition(goal, position);
                    stream.SetGoalWeightPosition(goal, positionWeight);
                }
            }
            else
            {
                // For some reason, IK will be broken if same values are not reapplied before SolveIK is called
                stream.SetGoalPosition(goal, stream.GetGoalPosition(goal));
                stream.SetGoalWeightPosition(goal, stream.GetGoalWeightPosition(goal));
            }

            if (data.rotationWeight > 0)
            {
                if (data.rotationWeight >= 1)
                {
                    stream.SetGoalRotation(goal, data.rotation);
                    stream.SetGoalWeightRotation(goal, 1f);
                }
                else
                {
                    var rotation       = Quaternion.Slerp(stream.GetGoalRotation(goal), data.rotation, data.rotationWeight);
                    var rotationWeight = Mathf.Lerp(stream.GetGoalWeightRotation(goal), 1f, data.rotationWeight);

                    stream.SetGoalRotation(goal, rotation);
                    stream.SetGoalWeightRotation(goal, rotationWeight);
                }
            }
            else
            {
                // Same as above
                stream.SetGoalRotation(goal, stream.GetGoalRotation(goal));
                stream.SetGoalWeightRotation(goal, stream.GetGoalWeightRotation(goal));
            }

            if (data.hintWeight > 0)
            {
                if (data.hintWeight >= 1)
                {
                    stream.SetHintPosition(hint, data.hintPosition);
                    stream.SetHintWeightPosition(hint, 1f);
                }
                else
                {
                    var hintPosition = Vector3.Lerp(stream.GetHintPosition(hint), data.hintPosition, data.hintWeight);
                    var hintWeight   = Mathf.Lerp(stream.GetHintWeightPosition(hint), 1f, data.hintWeight);

                    stream.SetHintPosition(hint, hintPosition);
                    stream.SetHintWeightPosition(hint, hintWeight);
                }
            }
            else
            {
                // Same as above
                stream.SetHintPosition(hint, stream.GetHintPosition(hint));
                stream.SetHintWeightPosition(hint, stream.GetHintWeightPosition(hint));
            }
        }