t1 / TFDContents / Assets / KinectDemos / OverlayDemo / Scripts / LinePainter.cs @ 3
이력 | 보기 | 이력해설 | 다운로드 (2.68 KB)
1 | 3 | KTH | using UnityEngine; |
---|---|---|---|
2 | using System.Collections; |
||
3 | using System.Collections.Generic; |
||
4 | |||
5 | public class LinePainter : MonoBehaviour |
||
6 | { |
||
7 | [Tooltip("Line renderer used for the line drawing.")] |
||
8 | public LineRenderer linePrefab; |
||
9 | |||
10 | [Tooltip("GUI-Text to display information messages.")] |
||
11 | public GUIText infoText; |
||
12 | |||
13 | |||
14 | private HandOverlayer handOverlayer = null; |
||
15 | private List<GameObject> linesDrawn = new List<GameObject>(); |
||
16 | private LineRenderer currentLine; |
||
17 | private int lineVertexIndex = 2; |
||
18 | |||
19 | void Start() |
||
20 | { |
||
21 | handOverlayer = GetComponent<HandOverlayer>(); |
||
22 | } |
||
23 | |||
24 | void Update() |
||
25 | { |
||
26 | if(Input.GetKeyDown(KeyCode.U)) |
||
27 | { |
||
28 | // U-key means Undo |
||
29 | DeleteLastLine(); |
||
30 | } |
||
31 | |||
32 | // display info message when a user is detected |
||
33 | KinectManager manager = KinectManager.Instance; |
||
34 | if(manager && manager.IsInitialized() && manager.IsUserDetected()) |
||
35 | { |
||
36 | if(infoText) |
||
37 | { |
||
38 | infoText.text = "Grip hand to start drawing. Press [U] to undo the last line."; |
||
39 | } |
||
40 | } |
||
41 | |||
42 | |||
43 | if(currentLine == null && |
||
44 | (handOverlayer && (handOverlayer.GetLastHandEvent() == InteractionManager.HandEventType.Grip))) |
||
45 | { |
||
46 | // start drawing lines |
||
47 | currentLine = Instantiate(linePrefab).GetComponent<LineRenderer>(); |
||
48 | currentLine.name = "Line" + linesDrawn.Count; |
||
49 | currentLine.transform.parent = transform; |
||
50 | |||
51 | Vector3 cursorPos = handOverlayer.GetCursorPos(); |
||
52 | cursorPos.z = Camera.main.nearClipPlane; |
||
53 | |||
54 | Vector3 cursorSpacePos = Camera.main.ViewportToWorldPoint(cursorPos); |
||
55 | currentLine.SetPosition(0, cursorSpacePos); |
||
56 | currentLine.SetPosition(1, cursorSpacePos); |
||
57 | |||
58 | lineVertexIndex = 2; |
||
59 | linesDrawn.Add(currentLine.gameObject); |
||
60 | |||
61 | StartCoroutine(DrawLine()); |
||
62 | } |
||
63 | |||
64 | if (currentLine != null && |
||
65 | (handOverlayer != null && (handOverlayer.GetLastHandEvent() == InteractionManager.HandEventType.Release))) |
||
66 | { |
||
67 | // end drawing lines |
||
68 | currentLine = null; |
||
69 | } |
||
70 | } |
||
71 | |||
72 | // undo the last drawn line |
||
73 | public void DeleteLastLine() |
||
74 | { |
||
75 | if (linesDrawn.Count > 0) |
||
76 | { |
||
77 | GameObject goLastLine = linesDrawn[linesDrawn.Count-1]; |
||
78 | |||
79 | linesDrawn.RemoveAt(linesDrawn.Count-1); |
||
80 | Destroy(goLastLine); |
||
81 | } |
||
82 | } |
||
83 | |||
84 | // continue drawing line |
||
85 | IEnumerator DrawLine() |
||
86 | { |
||
87 | while(handOverlayer && (handOverlayer.GetLastHandEvent() == InteractionManager.HandEventType.Grip)) |
||
88 | { |
||
89 | yield return new WaitForEndOfFrame(); |
||
90 | |||
91 | if (currentLine != null) |
||
92 | { |
||
93 | lineVertexIndex++; |
||
94 | currentLine.SetVertexCount(lineVertexIndex); |
||
95 | |||
96 | Vector3 cursorPos = handOverlayer.GetCursorPos(); |
||
97 | cursorPos.z = Camera.main.nearClipPlane; |
||
98 | |||
99 | Vector3 cursorSpacePos = Camera.main.ViewportToWorldPoint(cursorPos); |
||
100 | currentLine.SetPosition(lineVertexIndex - 1, cursorSpacePos); |
||
101 | } |
||
102 | } |
||
103 | } |
||
104 | |||
105 | } |