//------------------------------------------------- // Computes the angle to rotate the game object based on the change in the transform //------------------------------------------------- private void ComputeAngle( Hand hand ) { Vector3 toHandProjected = ComputeToTransformProjected( hand.hoverSphereTransform ); if ( !toHandProjected.Equals( lastHandProjected ) ) { float absAngleDelta = Vector3.Angle( lastHandProjected, toHandProjected ); if ( absAngleDelta > 0.0f ) { if ( frozen ) { float frozenSqDist = ( hand.hoverSphereTransform.position - frozenHandWorldPos ).sqrMagnitude; if ( frozenSqDist > frozenSqDistanceMinMaxThreshold.x ) { outAngle = frozenAngle + Random.Range( -1.0f, 1.0f ); float magnitude = Util.RemapNumberClamped( frozenSqDist, frozenSqDistanceMinMaxThreshold.x, frozenSqDistanceMinMaxThreshold.y, 0.0f, 1.0f ); if ( magnitude > 0 ) { StartCoroutine( HapticPulses( hand.controller, magnitude, 10 ) ); } else { StartCoroutine( HapticPulses( hand.controller, 0.5f, 10 ) ); } if ( frozenSqDist >= frozenSqDistanceMinMaxThreshold.y ) { onFrozenDistanceThreshold.Invoke(); } } } else { Vector3 cross = Vector3.Cross( lastHandProjected, toHandProjected ).normalized; float dot = Vector3.Dot( worldPlaneNormal, cross ); float signedAngleDelta = absAngleDelta; if ( dot < 0.0f ) { signedAngleDelta = -signedAngleDelta; } if ( limited ) { float angleTmp = Mathf.Clamp( outAngle + signedAngleDelta, minAngle, maxAngle ); if ( outAngle == minAngle ) { if ( angleTmp > minAngle && absAngleDelta < minMaxAngularThreshold ) { outAngle = angleTmp; lastHandProjected = toHandProjected; } } else if ( outAngle == maxAngle ) { if ( angleTmp < maxAngle && absAngleDelta < minMaxAngularThreshold ) { outAngle = angleTmp; lastHandProjected = toHandProjected; } } else if ( angleTmp == minAngle ) { outAngle = angleTmp; lastHandProjected = toHandProjected; onMinAngle.Invoke(); if ( freezeOnMin ) { Freeze( hand ); } } else if ( angleTmp == maxAngle ) { outAngle = angleTmp; lastHandProjected = toHandProjected; onMaxAngle.Invoke(); if ( freezeOnMax ) { Freeze( hand ); } } else { outAngle = angleTmp; lastHandProjected = toHandProjected; } } else { outAngle += signedAngleDelta; lastHandProjected = toHandProjected; } } } } }