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
获得(右手)符号角。
你好,我尝试了很多不同的方法来在 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
获得(右手)符号角。