Leap Motion获得手指弯曲(C#)

时间:2017-09-17 10:42:12

标签: c# leap-motion

您好我尝试了很多不同的方法来获得Leap Motion中的弯曲角度。但我无法获得真正的价值观。我用这种方法进行阅读。提前致谢。

Bone bone1 = finger.Bone(Bone.BoneType.TYPE_INTERMEDIATE);
Bone bone2 = finger.Bone(Bone.BoneType.TYPE_PROXIMAL);
double angle = 180 - ((bone1.Direction.AngleTo(bone2.Direction) / Math.PI) * 180) * 2;

1 个答案:

答案 0 :(得分:0)

在这个例子中,我将使用数组访问器作为从Finger对象访问骨骼的更快捷方式。

作为参考,骨指数为:0 =掌骨,1 =近端,2 =中间,3 =远端。您可以通过查看BoneType的定义来验证这一点。

(小心,拇指比其他手指少一个骨头。)

Vector3 bone0Dir = finger.bones[0].Direction.ToVector3();
Vector3 bone1Dir = finger.bones[1].Direction.ToVector3();

float angle = Vector3.Angle(bone0Dir, bone1Dir);

此示例检索掌骨与finger对象的近端骨骼之间的角度。

请注意,Vector3.Angle返回两个骨骼之间的无符号角度;如果您需要签名角度,可以使用SignedAngle功能。你需要传递一个参考轴; Vector3.Cross(hand.PalmarAxis(), hand.DistalAxis())适合此。

编辑:啊,道歉,如果您不在Unity引擎之外,答案会有所不同。在这种情况下,Leap.Vector.AngleTo就足够了,但是有一种更简单的方法可以将弧度转换为度数:

Vector bone0Dir = finger.bones[0].Direction;
Vector bone1Dir = finger.bones[1].Direction;

float angle = bone0Dir.AngleTo(bone1Dir) * Vector.RAD_TO_DEG;

同样,这将返回无符号角度,但手指通常不会向后弯曲,因此这应该足以满足您的使用需求。您也可以使用Math.Asin((bone0Dir.Cross(bone1Dir).Magnitude)) * RAD_TO_DEG获得(右手)签名角度。