diff Orchestland/Assets/LeapMotion/Scripts/Hands/RigidFinger.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Orchestland/Assets/LeapMotion/Scripts/Hands/RigidFinger.cs	Fri Jul 17 23:09:20 2015 +0900
@@ -0,0 +1,76 @@
+/******************************************************************************\
+* Copyright (C) Leap Motion, Inc. 2011-2014.                                   *
+* Leap Motion proprietary. Licensed under Apache 2.0                           *
+* Available at http://www.apache.org/licenses/LICENSE-2.0.html                 *
+\******************************************************************************/
+
+using UnityEngine;
+using System.Collections;
+using Leap;
+
+// The finger model for our rigid hand made out of various cubes.
+public class RigidFinger : SkeletalFinger {
+
+  public float filtering = 0.5f;
+
+  void Start() {
+    for (int i = 0; i < bones.Length; ++i) {
+      if (bones[i] != null) {
+        bones[i].GetComponent<Rigidbody>().maxAngularVelocity = Mathf.Infinity;
+      }
+    }
+  }
+
+  public override void UpdateFinger() {
+    for (int i = 0; i < bones.Length; ++i) {
+      if (bones[i] != null) {
+        // Set bone dimensions.
+        CapsuleCollider capsule = bones[i].GetComponent<CapsuleCollider>();
+        if (capsule != null)
+        {
+          // Initialization
+          capsule.direction = 2;
+          bones[i].localScale = new Vector3(1f, 1f, 1f);
+
+          // Update
+          capsule.radius = GetBoneWidth(i) / 2f;
+          capsule.height = GetBoneLength(i) + GetBoneWidth(i);
+        }
+
+        bool useVelocity = false;
+        Rigidbody boneBody = bones[i].GetComponent<Rigidbody>();
+        if (boneBody) {
+          if (!boneBody.isKinematic) {
+            useVelocity = true;
+
+            // Set velocity.
+            Vector3 target_bone_position = GetBoneCenter(i);
+            
+            bones[i].GetComponent<Rigidbody>().velocity = (target_bone_position - bones[i].position) * ((1 - filtering) / Time.deltaTime);
+
+            // Set angular velocity.
+            Quaternion target_rotation = GetBoneRotation(i);
+            Quaternion delta_rotation = target_rotation * Quaternion.Inverse(bones[i].rotation);
+            float angle = 0.0f;
+            Vector3 axis = Vector3.zero;
+            delta_rotation.ToAngleAxis(out angle, out axis);
+
+            if (angle >= 180) {
+              angle = 360 - angle;
+              axis  = -axis;
+            }
+
+            if (angle != 0) {
+              float delta_radians = (1 - filtering) * angle * Mathf.Deg2Rad;
+              bones[i].GetComponent<Rigidbody>().angularVelocity = delta_radians * axis / Time.deltaTime;
+            }
+          }
+        }
+        if (!useVelocity) {
+          bones[i].position = GetBoneCenter(i);
+          bones[i].rotation = GetBoneRotation(i);
+        }
+      }
+    }
+  }
+}