private void ResolveClassicPinchOrGrab() { float pinchStrength = SingleHandManager.Instance.CurrentHand.PinchStrength; float grabStrength = SingleHandManager.Instance.CurrentHand.GrabStrength; if (grabbing) { bool classicPinching = (pinchStrength >= unpinchThreshold); bool classicGrabbing = (grabStrength >= ungrabThreshold); grabbing = classicPinching | classicGrabbing; } else { bool classicPinching = (pinchStrength >= pinchThreshold); bool classicGrabbing = (grabStrength >= grabThreshold); grabbing = classicPinching | classicGrabbing; } if (grabbing) { GeneralisedGrabStrength = 1; } else { float normalisedPinchStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(pinchStrength, 0, pinchThreshold), 0, pinchThreshold, 0, 1); float normalisedGrabStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(grabStrength, 0, grabThreshold), 0, grabThreshold, 0, 1); GeneralisedGrabStrength = Mathf.Max(normalisedPinchStrength, normalisedGrabStrength); } }
private void OnDrawGizmos() { if (Application.isEditor && Application.isPlaying && DrawDebugGizmos) { float arcAngle = left ? ArcAngleLeft : ArcAngleRight; float circleCentreOffsetBase = cursorDotSize * CircleCentreOffsetBaseScale * _screenScale; float arcMidpointRadius = cursorDotSize * ArcMidpointOffsetScale * _screenScale; float currentCircleOffsetRadius = ScreenControlUtility.MapRangeToRange(radiusScale.Evaluate(generalisedGrabDetector.GeneralisedGrabStrength), 1, 0, arcMidpointRadius / 2, circleCentreOffsetBase); float finalOffsetRadius = arcMidpointRadius / 2; Vector2 anchoredPosition = Camera.main.ScreenToWorldPoint(_targetPos); Vector2 arcOffset = new Vector2() { x = arcMidpointRadius * Mathf.Cos(Mathf.Deg2Rad * arcAngle), y = arcMidpointRadius * Mathf.Sin(Mathf.Deg2Rad * arcAngle) }; Vector2 currentCircleOffset = new Vector2() { x = currentCircleOffsetRadius * Mathf.Cos(Mathf.Deg2Rad * (arcAngle + 180)), y = currentCircleOffsetRadius * Mathf.Sin(Mathf.Deg2Rad * (arcAngle + 180)) }; Vector2 finalOffset = new Vector2() { x = finalOffsetRadius * Mathf.Cos(Mathf.Deg2Rad * (arcAngle + 180)), y = finalOffsetRadius * Mathf.Sin(Mathf.Deg2Rad * (arcAngle + 180)) }; Vector3 arcMidpoint = new Vector3() { x = anchoredPosition.x + arcOffset.x, y = anchoredPosition.y + arcOffset.y, z = transform.position.z, }; Vector3 circleCentre = new Vector3() { x = arcMidpoint.x + currentCircleOffset.x, y = arcMidpoint.y + currentCircleOffset.y, z = arcMidpoint.z, }; Vector3 finalCircleCentre = new Vector3() { x = arcMidpoint.x + finalOffset.x, y = arcMidpoint.y + finalOffset.y, z = arcMidpoint.z, }; Gizmos.color = Color.red; Gizmos.DrawWireSphere(circleCentre, currentCircleOffsetRadius); Gizmos.color = Color.blue; Gizmos.DrawWireSphere(finalCircleCentre, finalOffsetRadius); Gizmos.color = Color.green; Gizmos.DrawWireSphere(Camera.main.ScreenToWorldPoint(_targetPos), 0.1f); } }
private bool ShouldTriggerGrab(Leap.Hand hand) { float handAngle = GetAngle(hand); float clampedHandAngle = Mathf.Clamp(handAngle, clickAngle, 180); GrabStrength = ScreenControlUtility.MapRangeToRange(clampedHandAngle, clickAngle, 180, 1, 0); return(handAngle < clickAngle); }
private void ResolveClassicGrab() { float grabStrength = SingleHandManager.Instance.CurrentHand.GrabStrength; if (grabbing) { grabbing = (grabStrength >= ungrabThreshold); GeneralisedGrabStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(grabStrength, 0, ungrabThreshold), 0, ungrabThreshold, 0, 1); } else { grabbing = (grabStrength >= grabThreshold); GeneralisedGrabStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(grabStrength, 0, grabThreshold), 0, grabThreshold, 0, 1); } }
public IEnumerator ShrinkCursorDot() { YieldInstruction yieldInstruction = new YieldInstruction(); float elapsedTime = 0.0f; while (elapsedTime < pulseSeconds) { yield return(yieldInstruction); elapsedTime += Time.deltaTime; float scale = ScreenControlUtility.MapRangeToRange(pulseShrinkCurve.Evaluate(elapsedTime / pulseSeconds), 0, 1, cursorDownScale * cursorDotSize, cursorDotSize); SetCursorLocalScale(scale); } SetCursorLocalScale(cursorDownScale * cursorDotSize); cursorScalingRoutine = null; }
private IEnumerator ShrinkLine() { lineShrunk = true; YieldInstruction yieldInstruction = new YieldInstruction(); float elapsedTime = 0.0f; while (elapsedTime < LineGrowthSeconds) { yield return(yieldInstruction); elapsedTime += Time.deltaTime; float scale = ScreenControlUtility.MapRangeToRange(lineShrinkCurve.Evaluate(elapsedTime / LineGrowthSeconds), 0, 1, 1, LineGrowthMultiplier); SetLineRendererWidthScale(scale); } SetLineRendererWidthScale(1); lineScalingRoutine = null; }
private void ResolveCombinedPinchAndGrab() { float pinchStrength = SingleHandManager.Instance.CurrentHand.PinchStrength; float fistStrength = SingleHandManager.Instance.CurrentHand.GetFistStrength(); float combinedStrength = pinchStrength + fistStrength; if (grabbing) { grabbing = combinedStrength >= combinedUngrabThreshold; GeneralisedGrabStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(combinedStrength, 0, combinedUngrabThreshold), 0, combinedUngrabThreshold, 0, 1); } else { grabbing = (pinchStrength == pinchThreshold) && (combinedStrength >= combinedGrabThreshold); float clampedCombinedStrength = Mathf.Clamp(combinedStrength, 0, combinedGrabThreshold); GeneralisedGrabStrength = ScreenControlUtility.MapRangeToRange(Mathf.Clamp(clampedCombinedStrength + pinchStrength, 0, combinedGrabThreshold + pinchThreshold), 0, clampedCombinedStrength + pinchThreshold, 0, 1); } }
private void Update() { // side-on view float sideLeapPosX = ScreenControlUtility.MapRangeToRange(-PhysicalConfigurable.Config.LeapPositionRelativeToScreenBottomM.z, 0, PhysicalConfigurable.Config.ScreenHeightM, 0, sideonScreen.sizeDelta.y); float sideLeapPosY = ScreenControlUtility.MapRangeToRange(PhysicalConfigurable.Config.LeapPositionRelativeToScreenBottomM.y, 0, PhysicalConfigurable.Config.ScreenHeightM, 0, sideonScreen.sizeDelta.y); sideonScreen.localRotation = Quaternion.Euler(0, 0, PhysicalConfigurable.Config.ScreenRotationD); sideonLeap.localPosition = sideonScreen.localPosition + new Vector3(sideLeapPosX, sideLeapPosY, 0); sideonLeap.localRotation = Quaternion.Euler(PhysicalConfigurable.Config.LeapRotationD.z, 0, PhysicalConfigurable.Config.LeapRotationD.x); sideonLeap.localPosition = new Vector3(Mathf.Clamp(sideonLeap.localPosition.x, sideonLocalClampMin.x, sideonLocalClampMax.x), Mathf.Clamp(sideonLeap.localPosition.y, sideonLocalClampMin.y, sideonLocalClampMax.y), 0); // front-on view var aspectRatio = (float)GlobalSettings.ScreenWidth / (float)GlobalSettings.ScreenHeight; if (aspectRatio > 1) { // landscape frontonScreen.sizeDelta = new Vector2(dynamicScreenSizePX, dynamicScreenSizePX * ((float)GlobalSettings.ScreenHeight / (float)GlobalSettings.ScreenWidth)); } else { //portrait frontonScreen.sizeDelta = new Vector2(dynamicScreenSizePX * aspectRatio, dynamicScreenSizePX); } float frontLeapPosX = ScreenControlUtility.MapRangeToRange(PhysicalConfigurable.Config.LeapPositionRelativeToScreenBottomM.x, 0, PhysicalConfigurable.Config.ScreenHeightM, 0, frontonScreen.sizeDelta.y); float frontLeapPosY = ScreenControlUtility.MapRangeToRange(PhysicalConfigurable.Config.LeapPositionRelativeToScreenBottomM.y, 0, PhysicalConfigurable.Config.ScreenHeightM, 0, frontonScreen.sizeDelta.y); frontonLeap.localPosition = frontonScreen.localPosition + new Vector3(frontLeapPosX, (-frontonScreen.sizeDelta.y / 2) + frontLeapPosY, 0); frontonLeap.localRotation = Quaternion.Euler(0, 0, PhysicalConfigurable.Config.LeapRotationD.z); frontonLeap.localPosition = new Vector3(Mathf.Clamp(frontonLeap.localPosition.x, frontonLocalClampMin.x, frontonLocalClampMax.x), Mathf.Clamp(frontonLeap.localPosition.y, frontonLocalClampMin.y, frontonLocalClampMax.y), 0); }
List <Vector3> GenerateArcPositions(float _arcLengthPercentage, float _arcAngle) { if (generalisedGrabDetector == null) { // try to re-find it! generalisedGrabDetector = FindObjectOfType <GeneralisedGrabDetector>(); if (generalisedGrabDetector == null) { return(new List <Vector3>()); } } float circleCentreOffsetBase = cursorDotSize * CircleCentreOffsetBaseScale * _screenScale; float arcMidpointRadius = cursorDotSize * ArcMidpointOffsetScale * _screenScale; float currentCircleOffsetRadius = ScreenControlUtility.MapRangeToRange(radiusScale.Evaluate(generalisedGrabDetector.GeneralisedGrabStrength), 1, 0, arcMidpointRadius / 2, circleCentreOffsetBase); Vector2 anchoredPosition = Camera.main.ScreenToWorldPoint(cursorTransform.anchoredPosition); Vector2 arcOffset = new Vector2() { x = arcMidpointRadius * Mathf.Cos(Mathf.Deg2Rad * _arcAngle), y = arcMidpointRadius * Mathf.Sin(Mathf.Deg2Rad * _arcAngle) }; Vector2 currentCircleOffset = new Vector2() { x = currentCircleOffsetRadius * Mathf.Cos(Mathf.Deg2Rad * (_arcAngle + 180)), y = currentCircleOffsetRadius * Mathf.Sin(Mathf.Deg2Rad * (_arcAngle + 180)) }; Vector3 arcMidpoint = new Vector3() { x = anchoredPosition.x + arcOffset.x, y = anchoredPosition.y + arcOffset.y, z = transform.position.z, }; Vector3 circleCentre = new Vector3() { x = arcMidpoint.x + currentCircleOffset.x, y = arcMidpoint.y + currentCircleOffset.y, z = arcMidpoint.z, }; float finalOffsetRadius = arcMidpointRadius / 2; float arcLength = (float)(2 * Math.PI * finalOffsetRadius) * _arcLengthPercentage; Vector2 delta = (circleCentre - arcMidpoint); float thetaMidpoint = (Mathf.Deg2Rad * 180) + Mathf.Atan2(delta.y, delta.x); float thetaMin = thetaMidpoint - ((arcLength / 2) / currentCircleOffsetRadius); float thetaMax = thetaMidpoint + ((arcLength / 2) / currentCircleOffsetRadius); List <Vector3> positions = new List <Vector3>(); for (int i = 0; i < LineRendererPositions; i++) { float currentTheta = thetaMin + (i * (thetaMax - thetaMin) / LineRendererPositions); positions.Add(new Vector3() { x = circleCentre.x + Mathf.Cos(currentTheta) * currentCircleOffsetRadius, y = circleCentre.y + Mathf.Sin(currentTheta) * currentCircleOffsetRadius, z = circleCentre.z }); } return(positions); }