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; } }