private void OnMultiGraspEnd(List <Hand> hands)
        {
            for (int i = 0; i < 2; i++)
            {
                _objSpacePullVectors[i] = Vector3.zero;
            }

            _multiGraspMode = MultiGraspMode.Moving;
            _scalingX       = false;
            _scalingY       = false;
            _scalingZ       = false;
        }
        private void OnMultiGraspHold(List <InteractionHand> hands)
        {
            for (int i = 0; i < 2; i++)
            {
                _objSpacePullVectors[i] = GetObjectSpaceGrabPoint(hands[i]);
            }

            switch (_multiGraspMode)
            {
            case MultiGraspMode.Moving:
                Vector3 avgPullVector            = (Abs(_objSpacePullVectors[0] - _objSpaceHandOffsets[0]) + Abs(_objSpacePullVectors[1] - _objSpaceHandOffsets[1])) / 2F;
                float   beginScalingDisplacement = 0.02F;
                bool    beginScaling             = false;

                Vector3 avgPullWorldScale = Vector3.Scale(avgPullVector, this.transform.localScale);
                if (avgPullWorldScale.x > beginScalingDisplacement)
                {
                    _scalingX    = true;
                    beginScaling = true;
                }
                else if (avgPullWorldScale.y > beginScalingDisplacement)
                {
                    _scalingY    = true;
                    beginScaling = true;
                }
                else if (avgPullWorldScale.z > beginScalingDisplacement)
                {
                    _scalingZ    = true;
                    beginScaling = true;
                }

                if (beginScaling)
                {
                    _multiGraspMode = MultiGraspMode.MovingAndScaling;
                }
                break;

            case MultiGraspMode.MovingAndScaling:
            default:
                Vector3 handOffsetPull = _objSpaceHandOffsets[0] - _objSpaceHandOffsets[1];
                Vector3 scalePull      = _objSpacePullVectors[0] - _objSpacePullVectors[1];

                Vector3 scaleFraction = Vector3.Max(scalePull.CompDiv(handOffsetPull), Vector3.zero);

                Vector3 largestDeltaEffLocalScale = this.transform.localScale;

                if (!_scalingX)
                {
                    scaleFraction             = new Vector3(1F, scaleFraction.y, scaleFraction.z);
                    largestDeltaEffLocalScale = new Vector3(1F, largestDeltaEffLocalScale.y, largestDeltaEffLocalScale.z);
                }
                if (!_scalingY)
                {
                    scaleFraction             = new Vector3(scaleFraction.x, 1F, scaleFraction.z);
                    largestDeltaEffLocalScale = new Vector3(largestDeltaEffLocalScale.x, 1F, largestDeltaEffLocalScale.z);
                }
                if (!_scalingZ)
                {
                    scaleFraction             = new Vector3(scaleFraction.x, scaleFraction.y, 1F);
                    largestDeltaEffLocalScale = new Vector3(largestDeltaEffLocalScale.x, largestDeltaEffLocalScale.y, 1F);
                }

                switch (_scalingMode)
                {
                case ScalingMode.IndependentXYZ:
                    // do nothing; this mode is the default behavior
                    break;

                case ScalingMode.YAndXZ:
                    // Y scales independently, but XZ are locked together.
                    float scaleFractionXZ = _scalingX ? scaleFraction.x : scaleFraction.z;
                    scaleFraction = new Vector3(scaleFractionXZ, scaleFraction.y, scaleFractionXZ);
                    break;

                case ScalingMode.IdenticalXYZ:
                    if (_scalingX)
                    {
                        scaleFraction = new Vector3(scaleFraction.x, scaleFraction.x, scaleFraction.x);
                    }
                    else if (_scalingY)
                    {
                        scaleFraction = new Vector3(scaleFraction.y, scaleFraction.y, scaleFraction.y);
                    }
                    else
                    {
                        scaleFraction = new Vector3(scaleFraction.z, scaleFraction.z, scaleFraction.z);
                    }
                    break;
                }

                Vector3 scaleTarget = Vector3.Scale(this.transform.localScale, scaleFraction);

                float largestDelta = LargestAbsDeltaComponent(scaleTarget, largestDeltaEffLocalScale);

                float lerpCoeffPerSec = largestDelta.Map(0.001F, 1F, 2F, 50F);
                this.transform.localScale = Vector3.Lerp(this.transform.localScale, scaleTarget, lerpCoeffPerSec * Time.deltaTime);

                break;
            }
        }