Mercurial > hg > Game > Games
view Orchestland/Assets/LeapMotion/Scripts/Hands/RigidHand.cs @ 3:0030a1b971fb default tip
merge
author | Yuta ANSE <e135745@ie.u-ryukyu.ac.jp> |
---|---|
date | Fri, 17 Jul 2015 23:23:43 +0900 |
parents | f7675884f2a1 |
children |
line wrap: on
line source
/******************************************************************************\ * 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 model for our rigid hand made out of various polyhedra. public class RigidHand : SkeletalHand { public float filtering = 0.5f; public override void InitHand() { base.InitHand(); } public override void UpdateHand() { for (int f = 0; f < fingers.Length; ++f) { if (fingers[f] != null) fingers[f].UpdateFinger(); } if (palm != null) { bool useVelocity = false; Rigidbody palmBody = palm.GetComponent<Rigidbody>(); if (palmBody) { if (!palmBody.isKinematic) { useVelocity = true; // Set palm velocity. Vector3 target_position = GetPalmCenter(); palmBody.velocity = (target_position - palm.position) * (1 - filtering) / Time.deltaTime; // Set palm angular velocity. Quaternion target_rotation = GetPalmRotation(); Quaternion delta_rotation = target_rotation * Quaternion.Inverse(palm.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; palmBody.angularVelocity = delta_radians * axis / Time.deltaTime; } } } if (!useVelocity) { palm.position = GetPalmCenter(); palm.rotation = GetPalmRotation(); } } if (forearm != null) { // Set arm dimensions. CapsuleCollider capsule = forearm.GetComponent<CapsuleCollider> (); if (capsule != null) { // Initialization capsule.direction = 2; forearm.localScale = new Vector3 (1f, 1f, 1f); // Update capsule.radius = GetArmWidth () / 2f; capsule.height = GetArmLength () + GetArmWidth (); } bool useVelocity = false; Rigidbody forearmBody = forearm.GetComponent<Rigidbody> (); if (forearmBody) { if (!forearmBody.isKinematic) { useVelocity = true; // Set arm velocity. Vector3 target_position = GetArmCenter (); forearmBody.velocity = (target_position - forearm.position) * (1 - filtering) / Time.deltaTime; // Set arm velocity. Quaternion target_rotation = GetArmRotation (); Quaternion delta_rotation = target_rotation * Quaternion.Inverse (forearm.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; forearmBody.angularVelocity = delta_radians * axis / Time.deltaTime; } } } if (!useVelocity) { forearm.position = GetArmCenter(); forearm.rotation = GetArmRotation(); } } } }