t1 / TFDContents / Assets / KinectDemos / InteractionDemo / Scripts / GrabRotateScript.cs @ 3
이력 | 보기 | 이력해설 | 다운로드 (5.31 KB)
| 1 | 3 | KTH | using UnityEngine; |
|---|---|---|---|
| 2 | using System.Collections; |
||
| 3 | |||
| 4 | public class GrabRotateScript : MonoBehaviour, InteractionListenerInterface |
||
| 5 | {
|
||
| 6 | [Tooltip("Material used to outline the object when selected.")]
|
||
| 7 | public Material selectedObjectMaterial; |
||
| 8 | |||
| 9 | [Tooltip("Smooth factor used for object rotations.")]
|
||
| 10 | public float smoothFactor = 3.0f; |
||
| 11 | |||
| 12 | [Tooltip("Camera used for screen ray-casting. This is usually the main camera.")]
|
||
| 13 | public Camera screenCamera; |
||
| 14 | |||
| 15 | [Tooltip("GUI-Text used to display information messages.")]
|
||
| 16 | public GUIText infoGuiText; |
||
| 17 | |||
| 18 | [Tooltip("Interaction manager instance, used to detect hand interactions. If left empty, it will be the first interaction manager found in the scene.")]
|
||
| 19 | public InteractionManager interactionManager; |
||
| 20 | |||
| 21 | |||
| 22 | //private bool isLeftHandDrag = false; |
||
| 23 | private InteractionManager.HandEventType lastHandEvent = InteractionManager.HandEventType.None; |
||
| 24 | private Vector3 screenNormalPos = Vector3.zero; |
||
| 25 | |||
| 26 | private GameObject selectedObject; |
||
| 27 | private Material savedObjectMaterial; |
||
| 28 | |||
| 29 | |||
| 30 | void Start() |
||
| 31 | {
|
||
| 32 | // by default set the main-camera to be screen-camera |
||
| 33 | if (screenCamera == null) |
||
| 34 | {
|
||
| 35 | screenCamera = Camera.main; |
||
| 36 | } |
||
| 37 | |||
| 38 | // get the interaction manager instance |
||
| 39 | if (interactionManager == null) |
||
| 40 | {
|
||
| 41 | interactionManager = InteractionManager.Instance; |
||
| 42 | } |
||
| 43 | } |
||
| 44 | |||
| 45 | |||
| 46 | void Update() |
||
| 47 | {
|
||
| 48 | if(interactionManager != null && interactionManager.IsInteractionInited()) |
||
| 49 | {
|
||
| 50 | Vector3 screenPixelPos = Vector3.zero; |
||
| 51 | |||
| 52 | if(selectedObject == null) |
||
| 53 | {
|
||
| 54 | // no object is currently selected or dragged. |
||
| 55 | // check if there is an underlying object to be selected |
||
| 56 | if(lastHandEvent == InteractionManager.HandEventType.Grip && screenNormalPos != Vector3.zero) |
||
| 57 | {
|
||
| 58 | // convert the normalized screen pos to pixel pos |
||
| 59 | screenNormalPos = interactionManager.IsLeftHandPrimary() ? interactionManager.GetLeftHandScreenPos() : interactionManager.GetRightHandScreenPos(); |
||
| 60 | |||
| 61 | screenPixelPos.x = (int)(screenNormalPos.x * (screenCamera ? screenCamera.pixelWidth : Screen.width)); |
||
| 62 | screenPixelPos.y = (int)(screenNormalPos.y * (screenCamera ? screenCamera.pixelHeight : Screen.height)); |
||
| 63 | Ray ray = screenCamera ? screenCamera.ScreenPointToRay(screenPixelPos) : new Ray(); |
||
| 64 | |||
| 65 | // check for underlying objects |
||
| 66 | RaycastHit hit; |
||
| 67 | if(Physics.Raycast(ray, out hit)) |
||
| 68 | {
|
||
| 69 | if(hit.collider.gameObject == gameObject) |
||
| 70 | {
|
||
| 71 | selectedObject = gameObject; |
||
| 72 | |||
| 73 | savedObjectMaterial = selectedObject.GetComponent<Renderer>().material; |
||
| 74 | selectedObject.GetComponent<Renderer>().material = selectedObjectMaterial; |
||
| 75 | } |
||
| 76 | } |
||
| 77 | } |
||
| 78 | } |
||
| 79 | else |
||
| 80 | {
|
||
| 81 | // continue dragging the object |
||
| 82 | screenNormalPos = interactionManager.IsLeftHandPrimary() ? interactionManager.GetLeftHandScreenPos() : interactionManager.GetRightHandScreenPos(); |
||
| 83 | |||
| 84 | float angleArounfY = screenNormalPos.x * 360f; // horizontal rotation |
||
| 85 | float angleArounfX = screenNormalPos.y * 360f; // vertical rotation |
||
| 86 | |||
| 87 | Vector3 vObjectRotation = new Vector3(-angleArounfX, -angleArounfY, 180f); |
||
| 88 | Quaternion qObjectRotation = screenCamera ? screenCamera.transform.rotation * Quaternion.Euler(vObjectRotation) : Quaternion.Euler(vObjectRotation); |
||
| 89 | |||
| 90 | selectedObject.transform.rotation = Quaternion.Slerp(selectedObject.transform.rotation, qObjectRotation, smoothFactor * Time.deltaTime); |
||
| 91 | |||
| 92 | // check if the object (hand grip) was released |
||
| 93 | bool isReleased = lastHandEvent == InteractionManager.HandEventType.Release; |
||
| 94 | |||
| 95 | if(isReleased) |
||
| 96 | {
|
||
| 97 | // restore the object's material and stop dragging the object |
||
| 98 | selectedObject.GetComponent<Renderer>().material = savedObjectMaterial; |
||
| 99 | selectedObject = null; |
||
| 100 | } |
||
| 101 | } |
||
| 102 | |||
| 103 | } |
||
| 104 | |||
| 105 | } |
||
| 106 | |||
| 107 | |||
| 108 | void OnGUI() |
||
| 109 | {
|
||
| 110 | if(infoGuiText != null && interactionManager != null && interactionManager.IsInteractionInited()) |
||
| 111 | {
|
||
| 112 | string sInfo = string.Empty; |
||
| 113 | |||
| 114 | long userID = interactionManager.GetUserID(); |
||
| 115 | if(userID != 0) |
||
| 116 | {
|
||
| 117 | if(selectedObject != null) |
||
| 118 | sInfo = selectedObject.name + " grabbed.\nYou can turn it now in all directions."; |
||
| 119 | else |
||
| 120 | sInfo = "Grab the object to turn it."; |
||
| 121 | } |
||
| 122 | else |
||
| 123 | {
|
||
| 124 | KinectManager kinectManager = KinectManager.Instance; |
||
| 125 | |||
| 126 | if(kinectManager && kinectManager.IsInitialized()) |
||
| 127 | {
|
||
| 128 | sInfo = "Waiting for Users..."; |
||
| 129 | } |
||
| 130 | else |
||
| 131 | {
|
||
| 132 | sInfo = "Kinect is not initialized. Check the log for details."; |
||
| 133 | } |
||
| 134 | } |
||
| 135 | |||
| 136 | infoGuiText.text = sInfo; |
||
| 137 | } |
||
| 138 | } |
||
| 139 | |||
| 140 | |||
| 141 | public void HandGripDetected(long userId, int userIndex, bool isRightHand, bool isHandInteracting, Vector3 handScreenPos) |
||
| 142 | {
|
||
| 143 | if (!isHandInteracting || !interactionManager) |
||
| 144 | return; |
||
| 145 | if (userId != interactionManager.GetUserID()) |
||
| 146 | return; |
||
| 147 | |||
| 148 | lastHandEvent = InteractionManager.HandEventType.Grip; |
||
| 149 | //isLeftHandDrag = !isRightHand; |
||
| 150 | screenNormalPos = handScreenPos; |
||
| 151 | } |
||
| 152 | |||
| 153 | public void HandReleaseDetected(long userId, int userIndex, bool isRightHand, bool isHandInteracting, Vector3 handScreenPos) |
||
| 154 | {
|
||
| 155 | if (!isHandInteracting || !interactionManager) |
||
| 156 | return; |
||
| 157 | if (userId != interactionManager.GetUserID()) |
||
| 158 | return; |
||
| 159 | |||
| 160 | lastHandEvent = InteractionManager.HandEventType.Release; |
||
| 161 | //isLeftHandDrag = !isRightHand; |
||
| 162 | screenNormalPos = handScreenPos; |
||
| 163 | } |
||
| 164 | |||
| 165 | public bool HandClickDetected(long userId, int userIndex, bool isRightHand, Vector3 handScreenPos) |
||
| 166 | {
|
||
| 167 | return true; |
||
| 168 | } |
||
| 169 | |||
| 170 | |||
| 171 | } |