コード例 #1
0
ファイル: GestureAction.cs プロジェクト: cnlanalex/AR_Tooth
    void INavigationHandler.OnNavigationUpdated(NavigationEventData eventData)
    {
        if (isSelected)
        {
            // 左右移动为旋转,上下移动为缩放
            float dx = eventData.NormalizedOffset.x;
            float dy = eventData.NormalizedOffset.y;
            if (System.Math.Abs(dx) > System.Math.Abs(dy))
            {
                // 2.c: Calculate a float rotationFactor based on eventData's NormalizedOffset.x multiplied by RotationSensitivity.
                // This will help control the amount of rotation.
                float rotationFactor = dx * RotationSensitivity;

                // 2.c: transform.Rotate around the Y axis using rotationFactor.
                transform.Rotate(new Vector3(0, -1 * rotationFactor, 0));
            }
            else
            {
                Vector3 dScale = Vector3.zero;
                //设置每一帧缩放的大小
                float scaleValue = 0.0002f;
                if (dy > 0)
                {
                    scaleValue = -1 * scaleValue;
                }
                //当缩放超出设置的最大,最小范围时直接返回
                if (transform.localScale.x > maxScale && scaleValue > 0)
                {
                    return;
                }
                if (transform.localScale.x < minScale && scaleValue < 0)
                {
                    return;
                }
                //根据比例计算每个方向上的缩放大小
                dScale.x              = scaleValue;
                dScale.y              = scaleValue;
                dScale.z              = scaleValue;
                transform.localScale += dScale;
            }
        }
        else
        {
            Vector3 currentHandPosition = Vector3.zero;
            InteractionSourceInfo sourceKind;
            inputSource.TryGetSourceKind(inputSourceId, out sourceKind);
            switch (sourceKind)
            {
            case InteractionSourceInfo.Hand:
                inputSource.TryGetGripPosition(inputSourceId, out currentHandPosition);
                break;

            case InteractionSourceInfo.Controller:
                inputSource.TryGetPointerPosition(inputSourceId, out currentHandPosition);
                break;
            }
            transform.position += (currentHandPosition - prevHandPosition) * TranslationSensitivity;
            prevHandPosition    = currentHandPosition;
        }
    }
コード例 #2
0
ファイル: GestureAction.cs プロジェクト: cnlanalex/AR_Tooth
    void INavigationHandler.OnNavigationStarted(NavigationEventData eventData)
    {
        InputManager.Instance.PushModalInputHandler(gameObject);
        eventData.Use(); // Mark the event as used, so it doesn't fall through to other handlers.

        if (!isSelected)
        {
            inputSource   = eventData.InputSource;
            inputSourceId = eventData.SourceId;

            Vector3 currentHandPosition = Vector3.zero;
            InteractionSourceInfo sourceKind;
            inputSource.TryGetSourceKind(inputSourceId, out sourceKind);
            switch (sourceKind)
            {
            case InteractionSourceInfo.Hand:
                inputSource.TryGetGripPosition(inputSourceId, out currentHandPosition);
                break;

            case InteractionSourceInfo.Controller:
                inputSource.TryGetPointerPosition(inputSourceId, out currentHandPosition);
                break;
            }
            prevHandPosition = currentHandPosition;
        }
        //gameObject.SendMessageUpwards("OnSelect", SendMessageOptions.DontRequireReceiver);
    }
コード例 #3
0
    //Called when dragging starts
    //Save initial hand position
    public void StartDragging(Vector3 initialDraggingPosition)
    {
        if (!isEnabled || !allowDragging || isDragging)
        {
            return;
        }

        // TODO: robertes: Fix push/pop and single-handler model so that multiple HandDraggable components
        //       can be active at once.

        // Add self as a modal input handler, to get all inputs during the manipulation
        InputManager.Instance.PushModalInputHandler(gameObject);

        isDragging = true;
        if (hostRigidbody != null)
        {
            hostRigidbodyWasKinematic = hostRigidbody.isKinematic;
            hostRigidbody.isKinematic = true;
        }


        Vector3 inputPosition = Vector3.zero;

#if UNITY_2017_2_OR_NEWER
        InteractionSourceInfo sourceKind;
        currentInputSource.TryGetSourceKind(currentInputSourceId, out sourceKind);
        switch (sourceKind)
        {
        case InteractionSourceInfo.Hand:
            currentInputSource.TryGetGripPosition(currentInputSourceId, out inputPosition);
            break;

        case InteractionSourceInfo.Controller:
            currentInputSource.TryGetPointerPosition(currentInputSourceId, out inputPosition);
            break;
        }
#else
        currentInputSource.TryGetPointerPosition(currentInputSourceId, out inputPosition);
#endif
        Debug.Log("Hand reference position " + inputPosition.ToString());

        draggingPosition     = initialDraggingPosition;
        handDraggingPosition = inputPosition;

        StartedDragging.RaiseEvent();
    }
コード例 #4
0
    public void StartScaling()
    {
        if (!IsScalingEnabled)
        {
            return;
        }

        if (isScaling)
        {
            return;
        }

        InputManager.Instance.PushModalInputHandler(gameObject);

        isScaling = true;

        Vector3 inputPosition = Vector3.zero;

#if UNITY_2017_2_OR_NEWER
        InteractionSourceInfo sourceKind;
        currentInputSource.TryGetSourceKind(currentInputSourceId, out sourceKind);
        switch (sourceKind)
        {
        case InteractionSourceInfo.Hand:
            currentInputSource.TryGetGripPosition(currentInputSourceId, out inputPosition);
            break;

        case InteractionSourceInfo.Controller:
            currentInputSource.TryGetPointerPosition(currentInputSourceId, out inputPosition);
            break;
        }
#else
        currentInputSource.TryGetPointerPosition(currentInputSourceId, out inputPosition);
#endif

        startPosition = inputPosition;
        startScale    = transform.localScale.x;

        StartedScaling.RaiseEvent();
    }
コード例 #5
0
        public static Vector3 GetHandPos(IInputSource currentInputSource, uint currentInputSourceId)
        {
#if UNITY_2017_2_OR_NEWER
            Vector3 pos = Vector3.zero;
            InteractionSourceInfo sourceKind;
            currentInputSource.TryGetSourceKind(currentInputSourceId, out sourceKind);
            switch (sourceKind)
            {
            case InteractionSourceInfo.Hand:
                currentInputSource.TryGetGripPosition(currentInputSourceId, out pos);
                break;

            case InteractionSourceInfo.Controller:
                currentInputSource.TryGetPointerPosition(currentInputSourceId, out pos);
                break;
            }
#else
            currentInputSource.TryGetPointerPosition(currentInputSourceId, out pos);
#endif
            return(pos);
        }
コード例 #6
0
        /// <summary>
        /// Starts dragging the object.
        /// </summary>
        public void StartDragging(Vector3 initialDraggingPosition)
        {
            if (!IsDraggingEnabled)
            {
                return;
            }

            if (isDragging)
            {
                return;
            }

            // TODO: robertes: Fix push/pop and single-handler model so that multiple HandDraggable components
            //       can be active at once.

            // Add self as a modal input handler, to get all inputs during the manipulation
            InputManager.Instance.PushModalInputHandler(gameObject);

            isDragging = true;
            if (hostRigidbody != null)
            {
                hostRigidbodyWasKinematic = hostRigidbody.isKinematic;
                hostRigidbody.isKinematic = true;
            }

            Transform cameraTransform = CameraCache.Main.transform;

            Vector3 inputPosition = Vector3.zero;

#if UNITY_2017_2_OR_NEWER
            InteractionSourceInfo sourceKind;
            currentInputSource.TryGetSourceKind(currentInputSourceId, out sourceKind);
            switch (sourceKind)
            {
            case InteractionSourceInfo.Hand:
                currentInputSource.TryGetGripPosition(currentInputSourceId, out inputPosition);
                break;

            case InteractionSourceInfo.Controller:
                currentInputSource.TryGetPointerPosition(currentInputSourceId, out inputPosition);
                break;
            }
#else
            currentInputSource.TryGetPointerPosition(currentInputSourceId, out inputPosition);
#endif

            Vector3 pivotPosition = GetHandPivotPosition(cameraTransform);
            handRefDistance = Vector3.Magnitude(inputPosition - pivotPosition);
            objRefDistance  = Vector3.Magnitude(initialDraggingPosition - pivotPosition);

            Vector3 objForward = HostTransform.forward;
            Vector3 objUp      = HostTransform.up;
            // Store where the object was grabbed from
            objRefGrabPoint = cameraTransform.transform.InverseTransformDirection(HostTransform.position - initialDraggingPosition);

            Vector3 objDirection  = Vector3.Normalize(initialDraggingPosition - pivotPosition);
            Vector3 handDirection = Vector3.Normalize(inputPosition - pivotPosition);

            objForward    = cameraTransform.InverseTransformDirection(objForward);    // in camera space
            objUp         = cameraTransform.InverseTransformDirection(objUp);         // in camera space
            objDirection  = cameraTransform.InverseTransformDirection(objDirection);  // in camera space
            handDirection = cameraTransform.InverseTransformDirection(handDirection); // in camera space

            objRefForward = objForward;
            objRefUp      = objUp;

            // Store the initial offset between the hand and the object, so that we can consider it when dragging
            gazeAngularOffset = Quaternion.FromToRotation(handDirection, objDirection);
            draggingPosition  = initialDraggingPosition;

            StartedDragging.RaiseEvent();
        }
コード例 #7
0
        /// <summary>
        /// オブジェクトのドラッグを開始する
        /// </summary>
        public void StartDragging(Vector3 initialDraggingPosition)
        {
            if (!IsDraggingEnabled)
            {
                return;
            }

            if (isDragging)
            {
                return;
            }

            // マニピュレーションのあいだのすべての入力を取得するため、自身をモーダル入力対象に追加する
            InputManager.Instance.PushModalInputHandler(gameObject);

            isDragging = true;

            Transform cameraTransform = CameraCache.Main.transform;

            // 手もしくはコントローラーの位置を取得する
            Vector3 inputPosition = Vector3.zero;

#if UNITY_2017_2_OR_NEWER
            InteractionSourceInfo sourceKind;
            currentInputSource.TryGetSourceKind(currentInputSourceId, out sourceKind);
            switch (sourceKind)
            {
            case InteractionSourceInfo.Hand:
                currentInputSource.TryGetGripPosition(currentInputSourceId, out inputPosition);
                break;

            case InteractionSourceInfo.Controller:
                currentInputSource.TryGetPointerPosition(currentInputSourceId, out inputPosition);
                break;
            }
#else
            currentInputSource.TryGetPointerPosition(currentInputSourceId, out inputPosition);
#endif

            // 基点の位置を取得する
            Vector3 pivotPosition = GetHandPivotPosition(cameraTransform);

            // つかんだときの基点と手とのあいだの距離
            handRefDistance = Vector3.Magnitude(inputPosition - pivotPosition);

            // 基点とオブジェクトのあいだの距離
            objRefDistance = Vector3.Magnitude(initialDraggingPosition - pivotPosition);

            Vector3 objForward = HostTransform.forward;
            Vector3 objUp      = HostTransform.up;

            // オブジェクトがつかまれた場所を保持する
            objRefGrabPoint = cameraTransform.transform.InverseTransformDirection(HostTransform.position - initialDraggingPosition);

            Vector3 objDirection  = Vector3.Normalize(initialDraggingPosition - pivotPosition);
            Vector3 handDirection = Vector3.Normalize(inputPosition - pivotPosition);

            objForward    = cameraTransform.InverseTransformDirection(objForward);    // カメラ空間での
            objUp         = cameraTransform.InverseTransformDirection(objUp);         // カメラ空間での
            objDirection  = cameraTransform.InverseTransformDirection(objDirection);  // カメラ空間での
            handDirection = cameraTransform.InverseTransformDirection(handDirection); // カメラ空間での

            objRefForward = objForward;
            objRefUp      = objUp;

            // 手とオブジェクトのあいだの最初の回転の差分を保持する
            // これによりドラッグ中にこれを考慮できる
            gazeAngularOffset = Quaternion.FromToRotation(handDirection, objDirection);
            draggingPosition  = initialDraggingPosition;

            StartedDragging.RaiseEvent();
        }