Kinect自定义光标

时间:2012-02-06 21:45:18

标签: c# wpf kinect

我需要在Kinect中制作光标,但我不知道从哪里开始。我需要使用WPF和C#来实现它。光标应该是手的形状,当我将鼠标悬停在元素上时,应该出现“加载”圆圈,当它“加载”时,它应该触发悬停元素上的点击事件。 我相信你们都熟悉这一点。

如果有人能给我一些指示,那将会有很大的帮助哦如何实现这一目标。

2 个答案:

答案 0 :(得分:3)

以下是可能对您有所帮助的代码段:

using Microsoft.Research.Kinect.Nui;

Runtime nui = Runtime.Kinects[0];
nui.Initialize(RuntimeOptions.UseSkeletalTracking);
nui.SkeletonFrameReady += new EventHandler<SkeletonFrameReadyEventArgs>(nui_SkeletonFrameReady);

void nui_SkeletonFrameReady(object sender, SkeletonFrameReadyEventArgs e)
{
    SkeletonFrame sf = e.SkeletonFrame;
    SkeletonData d = (from s in sf.Skeletons
                      where s.TrackingState == SkeletonTrackingState.Tracked
                      select s).FirstOrDefault();

     if (d != null)
     {
          SetHandPosition(imageCursor, d.Joints[JointID.HandLeft]);
     }
}

void SetHandPosition(FrameworkElement e, Joint joint)
{
    Joint scaledJoint = Coding4Fun.Kinect.Wpf.SkeletalExtensions.ScaleTo(joint, 600, 400, 0.75f, 0.75f);

    Canvas.SetLeft(e, scaledJoint.Position.X);
    Canvas.SetTop(e, scaledJoint.Position.Y);
} 

如果希望光标悬停在元素上,则只需转到元素属性并为该元素设置光标。在Visual Studio中,您可以在元素属性中选择一个游标。

要点击悬停在元素上,您必须实现MouseEnter事件

private void button1_MouseEnter(object sender, MouseEventArgs e)
{
....        
}

以下是一些关于它的信息:

button1.PerformClick() in wpf

答案 1 :(得分:1)

这是使用官方SDK的一个很好的解决方案,但即使你不是,它可以非常(!)有用(这对我来说):

您应该查看此处提供的{免费)代码Beginning Kinect Programming with the Microsoft Kinect SDK sample code,您点击了&#34;源代码/下载&#34;以及第6章(文件夹名称)中您将对此感兴趣的是什么。

基本上他们使用的静态类KinectInput允许引发像KinectCursorEnterEvent这样的新事件,有一个游标管理器KinectCursorManager几乎所有东西都可以获得手的位置/更新光标......然后他们使用一个装饰器来放置光标,并将你想要的FrameworkElement作为光标。

他们实施您正在谈论的HoverButton。它会在计时器结束后触发click事件(在KinectCursorEnterEvent发生时启动计时器)。他们提出的解决方案很优雅,并且可以轻松实现好的控件。 您可以轻松修改代码来处理两个光标(这是Kinect的增值,不是吗?)

拥有枚举CursorSide

public enum CursorSide
{
    Left,
    Right
}

并仅修改具有容量字典2的KinectCursorManager,并且枚举为Key,并且在每个指针的光标下的elemtn上有一个指针:

    private Dictionary<CursorSide, CursorAdorner> _cursorAdorner;
    private UIElement _lastElementOverRightHand;
    private UIElement _lastElementOverLeftHand;

但在你必须删除选择primaryHand的代码部分之前(基本上是最接近Kinect的手)。

我希望这可以帮助某人: - ]

这本书非常有趣,你可以买几块钱。