C# 在概念上与 Java 并没有太大的不同。Microsoft 甚至提供了有关该主题的在线帮助:Java 开发人员的 C# 编程语言。虽然我建议找一本不将 C# 包装在另一种语言的上下文中的好书——学习 C#,而不是“与 Java 相关的 C#”。
学习 Kinect 开发应该通过 Toolkit 示例来完成。真的没有更好的办法了。 当心在线教程!许多是为不再兼容的旧版本 SDK 编写的。为 SDK < 1.5 编写的任何内容都将无法正常工作,无需努力进行移植。
可以通过手势识别来检测跳跃插孔。有一些库为官方的 Microsoft Kinect SDK 提供此功能——我通常指的是Kinect Toolbox和Fizbin Gesture Library。两者都提供手势识别,只是使用不同的方法。
对于 Fizbin 手势库,您声明了一系列定义手势构造方式的类。例如,以下是库定义左手向身体右侧滑动的方式:
namespace Fizbin.Kinect.Gestures.Segments
{
/// <summary>
/// The first part of the swipe right gesture
/// </summary>
public class SwipeRightSegment1 : IRelativeGestureSegment
{
/// <summary>
/// Checks the gesture.
/// </summary>
/// <param name="skeleton">The skeleton.</param>
/// <returns>GesturePartResult based on if the gesture part has been completed</returns>
public GesturePartResult CheckGesture(Skeleton skeleton)
{
// left hand in front of left Shoulder
if (skeleton.Joints[JointType.HandLeft].Position.Z < skeleton.Joints[JointType.ElbowLeft].Position.Z && skeleton.Joints[JointType.HandRight].Position.Y < skeleton.Joints[JointType.HipCenter].Position.Y)
{
// left hand below shoulder height but above hip height
if (skeleton.Joints[JointType.HandLeft].Position.Y < skeleton.Joints[JointType.Head].Position.Y && skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.HipCenter].Position.Y)
{
// left hand left of left Shoulder
if (skeleton.Joints[JointType.HandLeft].Position.X < skeleton.Joints[JointType.ShoulderLeft].Position.X)
{
return GesturePartResult.Succeed;
}
return GesturePartResult.Pausing;
}
return GesturePartResult.Fail;
}
return GesturePartResult.Fail;
}
}
/// <summary>
/// The second part of the swipe right gesture
/// </summary>
public class SwipeRightSegment2 : IRelativeGestureSegment
{
/// <summary>
/// Checks the gesture.
/// </summary>
/// <param name="skeleton">The skeleton.</param>
/// <returns>GesturePartResult based on if the gesture part has been completed</returns>
public GesturePartResult CheckGesture(Skeleton skeleton)
{
// left hand in front of left Shoulder
if (skeleton.Joints[JointType.HandLeft].Position.Z < skeleton.Joints[JointType.ElbowLeft].Position.Z && skeleton.Joints[JointType.HandRight].Position.Y < skeleton.Joints[JointType.HipCenter].Position.Y)
{
// left hand below shoulder height but above hip height
if (skeleton.Joints[JointType.HandLeft].Position.Y < skeleton.Joints[JointType.Head].Position.Y && skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.HipCenter].Position.Y)
{
// left hand left of left Shoulder
if (skeleton.Joints[JointType.HandLeft].Position.X < skeleton.Joints[JointType.ShoulderRight].Position.X && skeleton.Joints[JointType.HandLeft].Position.X > skeleton.Joints[JointType.ShoulderLeft].Position.X)
{
return GesturePartResult.Succeed;
}
return GesturePartResult.Pausing;
}
return GesturePartResult.Fail;
}
return GesturePartResult.Fail;
}
}
/// <summary>
/// The third part of the swipe right gesture
/// </summary>
public class SwipeRightSegment3 : IRelativeGestureSegment
{
/// <summary>
/// Checks the gesture.
/// </summary>
/// <param name="skeleton">The skeleton.</param>
/// <returns>GesturePartResult based on if the gesture part has been completed</returns>
public GesturePartResult CheckGesture(Skeleton skeleton)
{
// //left hand in front of left Shoulder
if (skeleton.Joints[JointType.HandLeft].Position.Z < skeleton.Joints[JointType.ElbowLeft].Position.Z && skeleton.Joints[JointType.HandRight].Position.Y < skeleton.Joints[JointType.HipCenter].Position.Y)
{
// left hand below shoulder height but above hip height
if (skeleton.Joints[JointType.HandLeft].Position.Y < skeleton.Joints[JointType.Head].Position.Y && skeleton.Joints[JointType.HandLeft].Position.Y > skeleton.Joints[JointType.HipCenter].Position.Y)
{
// left hand left of left Shoulder
if (skeleton.Joints[JointType.HandLeft].Position.X > skeleton.Joints[JointType.ShoulderRight].Position.X)
{
return GesturePartResult.Succeed;
}
return GesturePartResult.Pausing;
}
return GesturePartResult.Fail;
}
return GesturePartResult.Fail;
}
}
}
您可以按照代码中的注释查看手如何在身体上移动。
在你的跳跃千斤顶的情况下,你可以定义相对于一系列关节的手,在上升的过程中,然后在下降的过程中。如果我要快速吐出一系列检查,它们将是:
- 左/右手低于臀部中心
- 左/右手在臀部中心上方和左/右手在左/右肘部之外
- 左/右手在脊柱上方和左/右手在左/右肘外
- 左/右手在左/右肩上方和左/右手在左/右肘外侧
- 左/右手在头顶
...如果所有这些都匹配,那么您就有了半个跳跃式千斤顶。在相同的情况下反向进行所有检查,Gesture
您就有了一个完整的上身跳跃千斤顶。您可以添加腿部位置以获得全身跳跃式千斤顶。
Kinect 工具箱也可用于定义手势。我只是没有亲自使用它,所以我无法谈论所涉及的步骤。