프로젝트

일반

사용자정보

통계
| 개정판:

t1 / TFDContents / Assets / KinectDemos / OverlayDemo / Scripts / LinePainter.cs @ 3

이력 | 보기 | 이력해설 | 다운로드 (2.68 KB)

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