private void updateCameraManip() { var prevState = cameraManipState; cameraManipState = getCameraManipState(); bool leftPressed = cameraManipButton.GetState(SteamVR_Input_Sources.LeftHand); bool rightPressed = cameraManipButton.GetState(SteamVR_Input_Sources.RightHand); var leftPos = leftController.transform.position; var rightPos = rightController.transform.position; var midpoint = leftPressed && rightPressed ? (leftPos + rightPos) / 2f : leftPressed ? leftPos : rightPressed ? rightPos : Vector3.zero; var dist = leftPressed && rightPressed?Vector3.Distance(leftPos, rightPos) : 1f; if (cameraManipState != prevState) { Debug.Log("switching from " + prevState + " to " + cameraManipState); initialLeftPos = leftPos; initialRightPos = rightPos; initialScale = worldScale; initialOrigin = transform.position; initialRotation = transform.rotation; initialMidpoint = midpoint; initialDist = dist; } else if (cameraManipState != CameraManipState.None) { Debug.Log("updating with " + cameraManipState); var offset = midpoint - initialMidpoint; var scale = initialScale * dist / initialDist * scaleSpeed; scale = Mathf.Clamp(scale, minScale, maxScale); var newOrigin = (initialOrigin / initialScale + offset * moveSpeed) * scale; worldScale = scale; if (scale != worldScale) { worldScale = scale; transform.localScale = Vector3.one / worldScale; } if (newOrigin != worldOrigin) { worldOrigin = newOrigin; transform.position = worldOrigin; } // apply rotation iff two controllers active if (cameraManipState == CameraManipState.TransformWithBothControllers) { var delta = leftPos - rightPos; var initialDelta = initialLeftPos - initialRightPos; var newRotation = getRotation(delta, initialDelta); transform.rotation = newRotation; } } }
private void updateCameraManip() { var prevState = cameraManipState; cameraManipState = getCameraManipState(); bool leftPressed = cameraManipButton.GetState(SteamVR_Input_Sources.LeftHand); bool rightPressed = cameraManipButton.GetState(SteamVR_Input_Sources.RightHand); var leftPos = leftController.transform.position; var rightPos = rightController.transform.position; var midpoint = leftPressed && rightPressed ? (leftPos + rightPos) / 2f : leftPressed ? leftPos : rightPressed ? rightPos : Vector3.zero; var dist = leftPressed && rightPressed?Vector3.Distance(leftPos, rightPos) : 1f; if (cameraManipState != prevState) { Debug.Log("switching from " + prevState + " to " + cameraManipState); initialLeftPos = leftPos; initialRightPos = rightPos; initialScale = worldScale; initialOrigin = transform.position; initialRotation = transform.rotation; initialMidpoint = midpoint; initialDist = dist; } else if (cameraManipState != CameraManipState.None) { Debug.Log("updating with " + cameraManipState); var offset = midpoint - initialMidpoint; var scale = initialScale * dist / initialDist; // scale = Mathf.Clamp(scale, minScale, maxScale); var newOrigin = initialOrigin + offset; inverseTranslateTransform.position = initialOrigin + offset; translateTransform.position = initialOrigin - offset; scaleTransform.localScale = Vector3.one * Mathf.Pow(scale / initialScale, 2f); // var newOrigin = (initialOrigin + offset) * (scale / initialScale + 1f); //var newOrigin = (initialOrigin / initialScale + offset) *scale; //var newOrigin = initialOrigin * (1f - scale / initialScale) + offset; // initialOrigin - initialOrigin / scale * initialScale; // (initialOrigin / initialScale + offset) * scale; /*if (scale != worldScale) * { * worldScale = scale; * scaleTransform.localScale = Vector3.one * worldScale; * } * if (newOrigin != worldOrigin) * { * Debug.Log(newOrigin); * worldOrigin = newOrigin; * translateTransform.position = worldOrigin; * } */ // apply rotation iff two controllers active /* if (cameraManipState == CameraManipState.TransformWithBothControllers) * { * var delta = leftPos - rightPos; * var initialDelta = initialLeftPos - initialRightPos; * var newRotation = getRotation(delta, initialDelta); * transform.rotation = newRotation; * }*/ } }