有谁知道我应该使用什么技术来使显示视频向左、向右、向上和向下移动,如下面的视频所示?我想用 Kinect 来实现这一点,但想法不同。
提前致谢。
有谁知道我应该使用什么技术来使显示视频向左、向右、向上和向下移动,如下面的视频所示?我想用 Kinect 来实现这一点,但想法不同。
提前致谢。
编辑:
既然我醒了,我将更详细地介绍这一点(显然我花了一周的时间才醒来)。
因此,Winscape 项目通过将窗口从现实世界连接到虚拟世界来连接真实世界和虚拟世界。这样做的方式就像现实世界是虚拟世界的一部分一样,然后更改监视器的显示(伪装成窗口)以复制一个人应该看到的视图,如果他们存在于虚拟世界中。
想象一下你的虚拟世界。它不一定有尽头,但有一点你会停止尝试将内容渲染到其中,所以假设世界包含在一个包含所有渲染元素的盒子中。现在,Winscape 所做的就是让虚拟世界看起来真实存在于现实世界中,并且您可以通过监视器看到它。
第一步显然是创建你的虚拟世界。对于初学者,我建议只创建一个文字框。使每面墙都具有不同的颜色,或在墙上放置颜色渐变。做一些简单的事情。如果您还没有决定使用 3D 框架来处理这个问题,我建议您使用 XNA。它是 C#,可与 Kinect SDK 配合使用,并且它有大量在线教程可以帮助您。一旦你创建了你的世界,使用 XNA 在盒子里放置一个摄像头并添加一些简单的控件来旋转摄像头。这将允许您从内部查看框,以确保渲染按预期工作。
完成此操作后,您需要决定将窗户放在哪里。这些将成为您的 3D 场景的视点。为了演示这个概念,这是我从XNA 相机教程中拍摄的一张照片。
请注意,如果您阅读实际教程,他们不会说与我完全相同的内容,因为我只是在劫持图片以证明我的意思。所以,(0,0,0) 点就是你的“眼睛”所在的位置。粉红色的矩形将代表您的窗口。看着窗户,从眼睛到粉红色窗户的角落画了四条线。这四条线向前延伸,直到它们与背景碰撞,形成绿色矩形。这将是您的眼睛可以透过窗户看到的矩形。
请注意,XNA 实际上会为您处理很多此类问题。你只需要在你的虚拟场景中创建一个摄像头并移动它,做一些数学运算将它直接对准你的窗户。您会希望该摄像机以代表您在现实世界中的位置的方式出现在虚拟空间中。为此,您可以使用 Kinect 获取与自身相关的真实世界坐标,然后配置您的应用程序以了解 Kinect 相对于窗口的位置。结合这些数据,您可以获得与现实世界中的监视器相关的眼睛位置,并且由于监视器由虚拟世界中的窗口表示,您可以确定您在虚拟世界中的位置。所以把虚拟相机放在你的头在虚拟世界里,把它对准窗户,
原始的半清醒咆哮:
好的,我要试一试(现在几乎是凌晨 1 点,所以如果我做得不够出色,请告诉我,我醒来时会回来做这件事)。
首先,它会涉及到相当多的数学,我将略过。基本上,你有三层。
人----“Windows”(监视器)----场景
当然,这个场景并不存在。你必须将这个人融入一个虚拟世界,其中的场景实际上只是一个平面图像,存在于墙后面。该人可以看到所述场景的唯一方法是通过墙上的窗户,实际上这是由监视器伪造的。
所以,数学来了。Kinect 可以计算出你站在房间的哪个位置,更重要的是,可以计算出你的头在哪里。由此您可以大致了解您的眼睛在哪里。您需要抓住这一点(您的眼睛)并将其转换为您在虚拟世界中使用的坐标。然后,计算这些眼睛应该能够通过虚拟窗口看到什么。您可以通过将线条从眼睛投射到窗口的每个角落,一直到它碰到“场景”图片来做到这一点。每个窗口将对应背景图片上的一个矩形区域。这个矩形是需要绘制到屏幕上的。
最棘手的部分是建立虚拟世界以几乎完美地模仿现实世界。本质上,很多配置(“好吧,这个窗口在 Kinect 上方 1.5 米处.. 并且在其左侧 0.25 米处..”)。我也不确定你应该把场景图片放多远。如果我想到了什么,我会回到这个,但你当然可以尝试一下,找出一个适合你的设置的距离。
哦,等等,现在我知道为什么我无法计算出距离了。这是因为该示例使用的是 3D 模拟。很漂亮。所以你只需要弄清楚你想在模拟中播放窗口的位置或诸如此类的东西。
根据您要使用的设置(KinectDSK、libfreenect、OpenNI 等)以及您希望它的准确程度,有多种技术。
例如,OpenNI 有一个名为GetCoM的函数,它可以返回用户的质心(此时不需要跟踪骨架),可以使用该函数。看起来视频中使用了 OpenNI,但他们仍然使用旧版本。较新的版本允许在没有 'psi'(ψ) 姿势的情况下进行骨骼跟踪。
请注意,它看起来并不需要用户的头部方向。例如,身体可以指向一个方向,而头部可以指向另一个方向。G.Fanelli 和他的团队在该领域进行了大量研究。对于 Kinect,请查看来自消费者深度相机的实时头部姿势估计
我用 KinectSDK 和 Kinect for Windows 玩了一会儿,发现里面有一个Face Tracker。
最后,根据您希望跟踪的松散或精确程度、理想设置是什么(覆盖的最大距离、使用的内容等),您可以确定最适合您的 SDK/库。另外,我想这也取决于您的编程经验,在这种情况下,还要寻找更容易处理的包装器(例如 Unity、MaxMSP/Jitter、Processing、openFrameworks 等)