annotate Orchestland/Assets/LeapMotion/Scripts/Tools/ToolModel.cs @ 1:f7675884f2a1

Add Orchestland project
author Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2015 23:09:20 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 /******************************************************************************\
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2 * Copyright (C) Leap Motion, Inc. 2011-2014. *
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 * Leap Motion proprietary. Licensed under Apache 2.0 *
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 * Available at http://www.apache.org/licenses/LICENSE-2.0.html *
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 \******************************************************************************/
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 using UnityEngine;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 using System.Collections;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 using Leap;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 // NOTE: This file is a work in progress, changes to come.
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 /**
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 * Updates a tool model based on tracking data from the Leap Motion service/daemon.
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 * In the Leap Motion API, tools represent long, thin objects, like a pencil, which
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 * can be tracked by the Leap Motion sensor. Tools are not associated with hands.
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
16 *
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 * A GameObject representing the tool graphics and with this script attached can be added
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 * to a HandController's ToolModel slot. The HandController will spawn instances of the game object,
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19 * updates its position during its lifetime, and finally, destroy the spawned instance when
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 * tracking of the tool is lost.
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21 */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
22 public class ToolModel : MonoBehaviour {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
23
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
24 /** Smoothing factor applied to movement.*/
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
25 public float filtering = 0.5f;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
26
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
27 protected Tool tool_;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
28 protected HandController controller_;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 protected bool mirror_z_axis_ = false;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
30
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
31 /** The Leap Tool object. */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32 public Tool GetLeapTool() {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
33 return tool_;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
34 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
35
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
36 /** Sets the Leap Tool for this ToolModel. */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37 public void SetLeapTool(Tool tool) {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
38 tool_ = tool;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
39 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 /** Whether to mirror the tool and motion. */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42 public void MirrorZAxis(bool mirror = true) {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
43 mirror_z_axis_ = mirror;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46 /** The Leap Controller object providing tracking data. */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 public HandController GetController() {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 return controller_;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 /** Sets the Leap Controller for this ToolModel. */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 public void SetController(HandController controller) {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 controller_ = controller;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 /** The local rotation of this tool based on the tracked tool, the HandController, and the mirror setting.*/
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 public Quaternion GetToolRotation() {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 Quaternion local_rotation = Quaternion.FromToRotation(Vector3.forward,
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 tool_.Direction.ToUnity(mirror_z_axis_));
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 return GetController().transform.rotation * local_rotation;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
63 /** Calculates the tip velocity of this tool model within the scene. */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64 public Vector3 GetToolTipVelocity() {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65 Vector3 local_velocity = tool_.TipVelocity.ToUnityScaled(mirror_z_axis_);
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 Vector3 total_scale = Vector3.Scale(GetController().handMovementScale,
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 GetController().transform.localScale);
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 Vector3 scaled_velocity = Vector3.Scale(total_scale, local_velocity);
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69 return GetController().transform.TransformDirection(scaled_velocity);
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
71
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 /** The position of the tip of this tool in the Unity scene. */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73 public Vector3 GetToolTipPosition() {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 Vector3 local_point = tool_.TipPosition.ToUnityScaled(mirror_z_axis_);
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 Vector3 scaled_point = Vector3.Scale(GetController().handMovementScale, local_point);
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 return GetController().transform.TransformPoint(scaled_point);
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 /** Initalizes the tool by setting its position and orientation. */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 public void InitTool() {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81 transform.position = GetToolTipPosition();
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 transform.rotation = GetToolRotation();
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 /** Updates the tool by setting its position, velocity, and orientation. */
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 public void UpdateTool() {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 Vector3 target_position = GetToolTipPosition();
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 if (Time.deltaTime != 0) {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 GetComponent<Rigidbody>().velocity = (target_position - transform.position) *
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 (1 - filtering) / Time.deltaTime;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 // Set angular velocity.
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 Quaternion target_rotation = GetToolRotation();
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95 Quaternion delta_rotation = target_rotation *
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96 Quaternion.Inverse(transform.rotation);
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 float angle = 0.0f;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
98 Vector3 axis = Vector3.zero;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
99 delta_rotation.ToAngleAxis(out angle, out axis);
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101 if (angle >= 180) {
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
102 angle = 360 - angle;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
103 axis = -axis;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
104 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 if (angle != 0)
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
106 GetComponent<Rigidbody>().angularVelocity = (1 - filtering) * angle * axis;
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 }
f7675884f2a1 Add Orchestland project
Daiki OYAKAWA <e135764@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108 }