【问题标题】:Kinect Custom CursorKinect 自定义光标
【发布时间】:2012-05-10 23:21:35
【问题描述】:

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

如果有人可以给我写一些指导哦,如何做到这一点,那将是非常有帮助的。

【问题讨论】:

    标签: c# wpf kinect


    【解决方案1】:

    这是一个可能对您有所帮助的代码 sn-p:

    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

    【讨论】:

    【解决方案2】:

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

    您应该查看Beginning Kinect Programming with the Microsoft Kinect SDK sample code 此处提供的(免费)代码,点击“源代码/下载”,您对示例感兴趣的是第 6 章(文件夹名称)。

    基本上,他们使用静态类KinectInput,它允许引发像KinectCursorEnterEvent 这样的新事件,还有一个光标管理器KinectCursorManager,它几乎可以做任何事情来获取手的位置/更新光标......他们使用装饰器放置光标,将 FrameworkElement 用作光标。

    他们实现了你所说的HoverButton。它在计时器过去后触发点击事件(计时器在KinectCursorEnterEvent 发生时启动)。他们提出的解决方案很优雅,并且可以轻松实现漂亮的控件。 您可以轻松修改代码来处理两个光标(这就是 Kinect 的增值,不是吗?)

    有一个枚举CursorSide:

    public enum CursorSide
    {
        Left,
        Right
    }
    

    只修改KinectCursorManager,其字典容量为 2,枚举为 Key,每只手在光标下的元素上都有一个指针:

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

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

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

    这本书很有意思,几块钱就能买到。

    【讨论】:

      猜你喜欢
      • 2013-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2012-04-13
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多