如何用头部跟踪实现全息投影效果

我想重新创建这个: http : //www.youtube.com/watch?v= 9xMSGmjOZIg&feature= related

我可以关注跟踪用户的头部,在其中一个评论中,我相信作者说他使用顶点着色器来完成工作,但是使用什么逻辑来移动顶点以获得这种效果呢?

为了实现这个效果,你需要知道一些事情:

  1. 显示器表面的确切物理测量。
  2. 观看者的眼睛位置,相对于屏幕的中心。

一旦你有这个信息,获得效果相对简单。 而不是计算一个正常的投影matrix(通常通过采取相机的位置,垂直的视野,纵横比,以及近和远的剪辑距离),而不是使用明确的平截面构造自己的倾斜投影matrix。

要生成这些明确的平截面,您可以使用屏幕中心作为“零”位置,并根据观看者的眼睛位置(相对于零位置)和屏幕的两个角落定义每个平截面(也相对于零位)。 近平面和远平面平面可以平行于屏幕(math上稍微简单一点),也可以垂直于眼睛 – >零vector。

我似乎回想起D3D有一个明确的API来创建倾斜的投影matrix,而你需要在OpenGL中自己做math。 无论哪种方式,都有大量示例代码用于构建来自Google中任意平截面的倾斜投影matrix。

一旦你有了你的倾斜投影matrix,你的所有其他渲染正常发生,正如它与一个非倾斜的投影matrix一样。 注意:不要尝试旋转或翻译“相机”物体来模仿观众的动作; 这一切都是由倾斜投影matrix明确处理的。 (如果希望观众能够通过移动物体的方式在世界范围内进行导航,比如使用操纵杆,那么您需要使用摄像机。请记住,任何这样的摄像机运动/旋转将会相对于物理屏幕而言,而不是相对于观看者的视角,所以如果想使相机相对于观看者的面向移动,则需要做一些额外的math运算)

无论如何,最终效果是游戏呈现出严重扭曲的场景视图,精确地计算为当从观看者的眼睛位置(以及其他地方)特别观看时不会出现扭曲。

关于在问题中链接的video的几个笔记。 首先,video中显示的效果看起来像直升机放置在屏幕前方。 屏幕前方的物体总是很难在这种系统中performance得很好,因为视锥体非常狭窄,从尖锐的角度观察时,它们很容易卷到平截头体外。 出于这个原因,在屏幕后面放置对象要更加标准,把屏幕当作一个有限的“窗口”处理到另一个3D场景中。 如果要将对象放在屏幕的前方(或与屏幕相交),则将这些对象放在相对于屏幕大小较小的位置很重要,而不要将它们放在屏幕的前方,否则冒险的用户越过他们,否则难以find他们。

另外请注意,在这种渲染方式下,对象不会“popup”。 它明显地保持在平面屏幕上的2D图像。 第一次在现实生活中看到这样的事情,而不是在YouTubevideo中,这有点令人不安; 尽管在智力上知道这个形象仍然只是一个平面屏幕上的形象,但大多数人似乎并没有期待这一点。

最后,请注意显示滞后是这类效应的严重问题。 您的整个体系结构(观察者眼睛检测 – >渲染 – >显示)需要尽可能地做出反应,尽量减less使用该系统的人员的晕动病。 每个类似虚拟现实的系统都会遇到这样的问题,它试图根据人们的动作为人们提供图像; 很多(但不是全部)人根本无法应付超过几毫秒的滞后时间,很快就开始感到恶心。 滞后时间越长,受影响的人越多。 所以记住这一点。

在我看来,只要将摄像头位置设置到用户的头部位置,然后正常运行顶点着色器即可。

你可能需要通过一个matrix来提供它,以将Kinect使用的任何坐标转换成场景的世界空间,但这就是它。