【发布时间】:2012-05-10 23:21:35
【问题描述】:
我需要在 Kinect 中创建一个光标,但我不知道从哪里开始。我需要使用 WPF 和 C# 来制作它。光标应该是手形的,当我将鼠标悬停在元素上时,应该出现“加载”圆圈,当它“加载”时,它应该在悬停的元素上触发点击事件。 相信大家都熟悉。
如果有人可以给我写一些指导哦,如何做到这一点,那将是非常有帮助的。
【问题讨论】:
我需要在 Kinect 中创建一个光标,但我不知道从哪里开始。我需要使用 WPF 和 C# 来制作它。光标应该是手形的,当我将鼠标悬停在元素上时,应该出现“加载”圆圈,当它“加载”时,它应该在悬停的元素上触发点击事件。 相信大家都熟悉。
如果有人可以给我写一些指导哦,如何做到这一点,那将是非常有帮助的。
【问题讨论】:
这是一个可能对您有所帮助的代码 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)
{
....
}
这里有一些关于它的信息:
【讨论】:
这是一个使用官方 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 的手)的代码部分之前。
我希望这可以帮助某人:-]
这本书很有意思,几块钱就能买到。
【讨论】: