diff Orchestland/Assets/LeapMotion/Scripts/Utils/LeapUnityExtensions.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/Utils/LeapUnityExtensions.cs	Fri Jul 17 23:09:20 2015 +0900
@@ -0,0 +1,104 @@
+/******************************************************************************\
+* 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;
+
+namespace Leap {
+
+  /** 
+   * Extends the Leap Motion Vector class to converting points and directions from the
+   * Leap Motion coordinate system into the Unity coordinate system.
+   */
+  public static class UnityVectorExtension {
+
+    // Leap coordinates are in mm and Unity is in meters. So scale by 1000.
+    /** Scale factor from Leap units (millimeters) to Unity units (meters). */
+    public const float INPUT_SCALE = 0.001f;
+    /** Constant used when converting from right-handed to left-handed axes.*/
+    public static readonly Vector3 Z_FLIP = new Vector3(1, 1, -1);
+
+    /** 
+     * Converts a direction vector from Leap to Unity. (Does not scale.) 
+     * 
+     * Changes from the Leap Motion right-hand coordinate convention to the
+     * Unity left-handed convention by negating the z-coordinate.
+     *
+     * @param mirror If true, the vector is reflected along the z axis.
+     * @param leap_vector the Leap.Vector object to convert.
+     */
+    public static Vector3 ToUnity(this Vector leap_vector, bool mirror = false) {
+      if (mirror)
+        return ToVector3(leap_vector);
+
+      return FlipZ(ToVector3(leap_vector));
+    }
+
+    /** 
+     * Converts a point from Leap to Unity. (Scales.)
+     * 
+     * Changes from the Leap Motion right-hand coordinate convention to the
+     * Unity left-handed convention by negating the z-coordinate. Also scales
+     * from Leap Motion millimeter units to Unity meter units by multiplying
+     * the vector by .001.
+     *
+     * @param mirror If true, the vector is reflected along the z axis.
+     * @param leap_vector the Leap.Vector object to convert. 
+     */
+    public static Vector3 ToUnityScaled(this Vector leap_vector, bool mirror = false) {
+      if (mirror)
+        return INPUT_SCALE * ToVector3(leap_vector);
+      
+      return INPUT_SCALE * FlipZ(ToVector3(leap_vector));
+    }
+
+    private static Vector3 FlipZ(Vector3 vector) {
+      return Vector3.Scale(vector, Z_FLIP);
+    }
+
+    private static Vector3 ToVector3(Vector vector) {
+      return new Vector3(vector.x, vector.y, vector.z);
+    }
+  }
+
+  /**
+   * Extends the Leap Mition Matrix class to convert Leap Matrix objects to
+   * to Unity Quaternion rotations and translations.
+   */
+  public static class UnityMatrixExtension {
+    /** Up in the Leap coordinate system.*/
+    public static readonly Vector LEAP_UP = new Vector(0, 1, 0);
+    /** Forward in the Leap coordinate system.*/
+    public static readonly Vector LEAP_FORWARD = new Vector(0, 0, -1);
+    /** The origin point in the Leap coordinate system.*/
+    public static readonly Vector LEAP_ORIGIN = new Vector(0, 0, 0);
+
+    /**
+     * Converts a Leap Matrix object representing a rotation to a 
+     * Unity Quaternion.
+     * 
+     * @param matrix The Leap.Matrix to convert.
+     * @param mirror If true, the operation is reflected along the z axis.
+     */
+    public static Quaternion Rotation(this Matrix matrix, bool mirror = false) {
+      Vector3 up = matrix.TransformDirection(LEAP_UP).ToUnity(mirror);
+      Vector3 forward = matrix.TransformDirection(LEAP_FORWARD).ToUnity(mirror);
+      return Quaternion.LookRotation(forward, up);
+    }
+
+    /**
+     * Converts a Leap Matrix object representing a translation to a 
+     * Unity Vector3 object.
+     * 
+     * @param matrix The Leap.Matrix to convert.
+     * @param mirror If true, the operation is reflected along the z axis.
+     */
+    public static Vector3 Translation(this Matrix matrix, bool mirror = false) {
+      return matrix.TransformPoint(LEAP_ORIGIN).ToUnityScaled(mirror);
+    }
+  }
+}