LEAP运动获得手指弯曲(C#)



你好,我尝试了很多不同的方法来使弯曲角度在leap运动中。但是我无法获得真实的价值。我使用了这种方法来阅读。提前致谢。

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;

在此示例中,我将使用数组登录器作为从指对象访问骨骼的较快方法。

供参考,骨指数为:0 = metacarpal,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返回两个骨头之间的 unsigned 角。如果您想要签名的角度,则可以使用SignedAngle功能。您需要将其传递给参考轴;Vector3.Cross(hand.PalmarAxis(), hand.DistalAxis())适合此。


编辑:啊,抱歉,如果您不在Unity Engine之外,答案会有所不同。在这种情况下,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获得(右手)签名的角度。