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 | } |