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

Leap Motion Get Finger Bending (C#)

你好,我尝试了很多不同的方法来在 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;

在这个例子中,我将使用数组访问器作为从 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 return是两个骨骼之间的无符号角度;如果您需要带符号的角度,可以改用 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;

同样,这将 return 无符号角,但手指通常不会向后弯曲,因此这对您的用例来说应该足够了。您还可以使用 Math.Asin((bone0Dir.Cross(bone1Dir).Magnitude)) * RAD_TO_DEG 获得(右手)符号角。