【仅用于个人复习使用,顺序较乱】
下面记录一下Leap中的Base Class,以及一些乱七八糟的note~
我们从底层往高层解释,这里只mark一些核心的基本类。
这里给出Leap Motion的开发文档的翻译版:
http://brightguo.com/leap-motion-official-doc-translation/
不过这个文档比较老了,像Gesture识别在最新的API中已经不支持了,至少我是没有找到Gesture类~
这里是官方的开发文档(不过是英文的):
https://developer.leapmotion.com/documentation/v2/csharp/index.html?proglang=csharp
七、Base Class & 杂记
【杂记:Leap是以mm为单位的,而unity是以m为单位的,所以如果不是用官方的接口,而是用Base Class中的数据来自定义类的话,需要乘以0.001f。】
(1)Bone
using System;
namespace Leap
{
[Serializable]
public class Bone
{
//
// Fields
//
public Vector PrevJoint;//骨头的开始位置点
public Vector NextJoint;//骨头的结束位置点
public Vector Center;//骨头的中心
public Vector Direction;//骨头的方向
public float Length;//骨头的长度
public float Width;//骨头的宽度
public Bone.BoneType Type;//骨头的种类,是Bone的内部类,见下方
public LeapQuaternion Rotation;//骨头的旋转角度
//
// Properties
//
public LeapTransform Basis {
get;
}
//
// Constructors
//
public Bone ();
public Bone (Vector prevJoint, Vector nextJoint, Vector center, Vector direction, float length, float width, Bone.BoneType type, LeapQuaternion rotation);
//
// Methods
//
public bool Equals (Bone other);
public override string ToString ();
//
// Nested Types
//
public enum BoneType
{
TYPE_INVALID = -1,
TYPE_METACARPAL,//指掌骨
TYPE_PROXIMAL,//近端指骨
TYPE_INTERMEDIATE,//中端指骨
TYPE_DISTAL//末端指骨
}
//例如在FingerDirectionDetector中的这一句代码:
//fingerDirection = hand.Fingers[selectedFinger].Bone(Bone.BoneType.TYPE_DISTAL).Direction.ToVector3();
//通过Finger中的Bone函数取得对应的指骨的方向,这里取的是末端指骨的方向作为手指的方向,然后与目标方向进行匹配,再去执行Activate或者Deactivate。
//这里必须使用ToVector3,将Leap自定义的Vector类转换成unity中的Vector3类。
}
}
(2)Finger
using System;
namespace Leap
{
[Serializable]
public class Finger
{
//
// Fields
//
public float Width;//手指的宽度
public Bone[] bones;//Bone数组,表示组成这根手指的bones
public Finger.FingerType Type;//手指的类型,是Finger类中定义的内部类,见下方
public int Id;//手指的Id
public int HandId;//手指所属手的Id
public Vector TipPosition;//指尖的位置
public Vector TipVelocity;//指尖以mm/s为单位的移动速度
public Vector Direction;//手指的方向
public float Length;//手指的长度
public bool IsExtended;//手指是否展开
public Vector StabilizedTipPosition;//稳定指尖位置?
public float TimeVisible;//时间可见?
//
// Constructors
//
public Finger ();
public Finger (long frameId, int handId, int fingerId, float timeVisible, Vector tipPosition, Vector tipVelocity, Vector direction, Vector stabilizedTipPosition, float width, float length, bool isExtended, Finger.FingerType type, Bone metacarpal, Bone proximal, Bone intermediate, Bone distal);
//
// Methods
//
public Bone Bone (Bone.BoneType boneIx);
public override string ToString ();
//
// Nested Types
//
public enum FingerType
{
TYPE_THUMB,//拇指
TYPE_INDEX,//食指
TYPE_MIDDLE,//中指
TYPE_RING,//无名指
TYPE_PINKY,//小指
TYPE_UNKNOWN = -1
}
}
}
(3)Hand
using System;
using System.Collections.Generic;
namespace Leap
{
[Serializable]
public class Hand
{
//
// Fields
//
public long FrameId;//所属frame的Id
public Arm Arm;//手臂
public bool IsLeft;//是否是左手
public float Confidence;
public float TimeVisible;
public Vector WristPosition;//手腕的位置
public Vector StabilizedPalmPosition;//稳定手掌的位置?
//Pitch —— 绕x轴旋转的角度,俯仰角
//Yaw —— 绕y轴旋转的角度,偏航角
//Roll —— 绕z轴旋转的角度,翻滚角
//当然这里是Pinch,也就是挤压,握的意思
public float PinchDistance;//握的距离(用于PinchDetector)
public float PinchStrength;//握的强度?
public float PalmWidth;//手掌宽度
public float GrabStrength;//手的抓力?
public LeapQuaternion Rotation;//手的旋转角度
public Vector Direction;//手的方向
public Vector PalmNormal;//手掌的法向量
public Vector PalmVelocity;//手掌移动的速度,mm/s
public Vector PalmPosition;//手掌的位置
public List Fingers;//手指的数组,最多有五个元素,当然也可能为空。所以在使用前需要判断一下size
public int Id;//手的Id
public float GrabAngle;//抓取的角度?
//
// Properties
//
public LeapTransform Basis {
get;
}
public bool IsRight {
get;
}
//
// Constructors
//
public Hand ();
public Hand (long frameID, int id, float confidence, float grabStrength, float grabAngle, float pinchStrength, float pinchDistance, float palmWidth, bool isLeft, float timeVisible, Arm arm, List fingers, Vector palmPosition, Vector stabilizedPalmPosition, Vector palmVelocity, Vector palmNormal, LeapQuaternion palmOrientation, Vector direction, Vector wristPosition);
//
// Methods
//
public bool Equals (Hand other);
public Finger Finger (int id);//通过id获得对应的finger
public override string ToString ();
}
}
(4)Frame
using System;
using System.Collections.Generic;
namespace Leap
{
[Serializable]
public class Frame : IEquatable
{
//
// Fields
//
public long Id;
public long Timestamp;//当前帧的时间戳
public float CurrentFramesPerSecond;//每秒多少帧
public List Hands;//当前帧所识别出来的手的list,最多两个,也可能为空,使用的时候需要判断一下
public InteractionBox InteractionBox;//交互盒?
//
// Properties
//
public byte[] Serialize {
get;
}
public int SerializeLength {
get;
}
//
// Constructors
//
public Frame ();
public Frame (long id, long timestamp, float fps, InteractionBox interactionBox, List hands);
//
// Methods
//
public void Deserialize (byte[] arg);
public bool Equals (Frame other);
public Hand Hand (int id);//通过id取出左手或右手
internal void ResizeHandList (int count);
public override string ToString ();
}
}
大致的Base Class就这么多,基本都是通过frame,具体来说是Hand的相关信息,来实现一些手势的判定。