头部相关透视实时立体图形渲染算法的研究与实现
2017-04-25姚天成王巍
姚天成 王巍
摘要:研究并实现了一种对于实时三维立体图像渲染的视点相关透视改进算法,算法使得计算机输出的三维图像在传统显示器和投影仪设备等二维平面显示设备上,呈现出关于任意观察者头部位置进行透视矫正的立体图像。使用微软的Kinect for Windows设备来捕捉观察者的视点位置,使用Unity 3D游戏引擎渲染三维场景,使用两台投影仪分别在两个互相垂直的投影面上投影出拼接后的透视矫正的立体图像。实验结果表明本文算法视点相关的渲染效果具有鲁棒性和实时性。
关键词:立体图像;头部相关透视;虚拟现实; Unity 3D; Kinect for Windows
中图分类号:TP41 文献标识码:A 文章编号:1009-3044(2017)01-0175-04
Research and Implementation of Head-coupled Perspective Algorithm for Real-time Stereo Rendering
YAO Tian-cheng, WANG Wei
(Department of Computer Science and Engineering, Dalian Nationalities University, Dalian 116600, China)
Abstract: This article presents an implementation of head-coupled perspective technique which improves traditional computer generated real-time 3D stereo image rendering. This technique enables traditional planar display device such as monitors and projectors to have the ability to present perspective correct stereo image for the observer in arbitrary view positions. In the demonstration, a Microsoft Kinect for Windows is used to capture the observers head position. A PC with the game engine Unity 3D installed is used to take the observers head position data from Kinect as input and render out perspective correct stereo image. Finally, two projector are utilized to project two sub-images output from the rendering PC onto two perpendicular surface respectively to expand display surface area. Experimental results shows real-time and robustness of the proposed algorithm.
Key words:stereo rendering; head-coupled perspective; virtual reality; Unity 3D; Kinect for Windows
1 介绍
1.1 背景
立体显示技术[1]已经被广泛运用于生活中的各个领域。这种技术,一些算法中观察者需要佩戴特制的眼镜,如分色镜片,偏振镜片等,另一些算法则不需要。不过算法本质都是令每只眼睛分别看到由显示屏输出的带有瞳距偏移的图像,从而在大脑中重组获得带有深度的立体图像。
屏幕上的三维图像可以是事先由计算机生成或者使用立体摄像机拍摄好的,比如说3D电影;也可以是由计算机实时生成,比如说电子游戏、虚拟现实。然而,这些传统的算法中,无论立体图像是事先制作,还是计算机实时生成,都假设了用户的观察位置固定于屏幕中心前方的一定距离。当观察者的观察位置处于这个假设的观察点附近时,这种圖像获得较好的立体效果,一旦观察者远离这个假设的观察位置,立体效果就会有损失,对于观察者而言,画面会出现不期望的变形。这是因为在这种情形下,画面的透视分布不正确导致的。
为了解决这一问题,头部相关透视方法被提出来用于解决由于观察位置不同而导致的图像透视不正确问题。这种方法的基本原理是,立体图像由计算机采用虚拟场景实时渲染而成,除此之外,要使用某种捕捉设备获得当前观察者的头部位置,计算机对几何体进行投影要针对当前的观察者头部做出调整。观察者在移动头部位置时,图像的透视随之改变,造成一种类似通过一扇窗户观察虚拟场景的立体效果。
这种技术已经在各种虚拟现实系统中被广泛运用,也有部分电子游戏采用了这种技术。
1.2 本文的工作
本文的工作在于使用廉价、常见的设备,如Kinect for Windows,投影仪和普通PC,并使用免费游戏引擎软件Unity 3D,制作一个支持头部相关透视技术的虚拟现实系统。
除此之外,为了增加显示面积以增强立体效果,在本文的实现中,使用了两块投影屏幕呈互相垂直并且对齐后输出透视矫正的立体图像,尽可能地使得虚拟物体可以存在于屏幕前方,使得观察者能从更多角度看到虚拟物体的不同面。本文第二部分介绍立体感的主要来源,头部相关透视技术的基本原理和实现方法。第三部分介绍本文实现的一个基本的带有头部相关透视的立体图像虚拟现实系统的搭建方法,列出其所包含的硬件设备,介绍在Unity 3D引擎中的实现。最后,对本文算法进行了总结。
2 头部相关透视算法原理及实现
2.1 立体感的来源
本文把图像立体感的来源简单归纳为两个方面:透视和视差。
人眼对外界光线的感受器官视网膜在结构上是一个二维的结构,视网膜面前有一套类似于凸透镜的光学系统负责把物体的光线收集起来在视网膜上形成物体的像,这种结构使得人眼看到的图像成一种天然的透视结构,这种透视结构最基本的原则就是“近大远小”,即离眼睛越近,物体显得越大;离得越远,物体显得越小。而大脑中的视觉处理部分可以综合一副图像中各物体的相对大小,在这种透视结构的图像中解读出物体的深度分布信息。
在计算机图形学中,物体的成像需要经过透视投影。在这一阶段中,算法确定虚拟的视点位置,根据屏幕的大小,把虚拟物体表面的三维空间位置变换到屏幕上的二维坐标。投影的结果与凸透镜的成像效果类似,造成“近大远小”的透视效果。头部相关透视投影技术就是要对这一步骤做出改变。
然而,透视贡献的立体信息只占立体感来源的一部分,另外很重要的一部分就是视差。人类的眼睛在水平方向呈一定距离分布在两侧,形成了天然的瞳距。瞳距的存在使得两只眼睛的成像之间形成透视偏移。这种透视偏移的表现是,相同的物体,离人眼越远,在视网膜中成像位置的偏移越小;离人眼越近,在视网膜中的成像位置的偏移越大。视觉中枢根据这一原则,可以准确地测量出视觉中某一个点的深度信息,从而形成立体视觉。
为了生成有视差的图像,在计算机中通常需要使用两个虚拟的摄像机模拟人的双眼以一定的瞳距放置在场景中,每一帧都要为左右眼分别渲染一次场景后输出到显示设备上。在显示设备上,再通过特殊的手段把每个摄像机的画面分别单独呈现给观察者对应的眼睛。
2.2 头部相关透视
在计算机图形学的透视投影[2]模型中,一个摄像机拥有一个虚拟的投影平面,以及一个视点表示具体的观察位置。一个三维空间中的点与视点连线与投影平面的交点的二维坐标即一个点经过透视投影的二维坐标。这个投影坐标可以分别在摄像机X轴方向和Y轴方向上使用相似三角形原理计算得出。投影的坐标位置受到以下几个因素影响,一个是投影平面的大小,另一个是投影平面相对于视点的位置,这两个因素间接造就了不同的视场、宽高比等摄像机参数。
是远裁剪平面的深度,w是投影平面的宽度,h是投影平面的高度。其中视点位置实际上代表的是观察者的眼睛位置,固定视点即固定了观察者的观察位置,从而使得在其他位置观察投影后的图形是透视错误的。为了实现头部相关透视,必须抛弃视点位置是固定的这一假设。
若视点不固定在投影面中垂线上,为了计算方便,首先将视点仍然放在取景坐标原点,然后相反地,在XOY平面上反向移动投影平面的位置,这等价于视点相对于投影平面(即屏幕)的运动。使用四个参数l,r,t,b分别代表投影平面左、右、顶、底边界的坐标范围。这种更一般的透视投影矩阵需如下计算:
可以事先指定好,本文的实现中,为了能够实现虚拟物体向外穿越屏幕的效果,需要避免物体被近裁平面裁剪掉,因而给
3 演示系统的算法实现
3.1 概述
这个演示系统的目标是利用现有的廉价、常见的硬件设备来搭建一个支持头部相关透视[3-4]的简易虚拟现实系统,并尽可能地提高系统的精确度、降低延迟和增加可视面积。
本系统采用的硬件配备清单如下:
游戏引擎Unity 3D[5]被用于渲染虚拟场景,本文使用的版本为5.0.1。Kinect SDK版本为1.8,并且采用了CMU Kinect for Windows SDK Wrapper for Unity从而使得Kinect SDK API可以在Unity 3D中被调用。
3.2 坐标系统
Kinect的骨架关节识别数据[6]是在其定义的设备坐标系中描述的,而为了进行头部相关透视投影,需要计算出頭部位置关于屏幕位置的相对坐标,所以必须要建立一个统一的坐标系统,用来为位置数据在不同坐标系下的变换作为桥梁。
本文的算法设计中对系统建立了一个“物理世界坐标系”,规定坐标系的原点在墙角地板上,三个轴分别沿着地板与墙面之间两两形成的交线方向向房间内部延伸,形成一个左手笛卡尔坐标系。接下来,对各个设备的位置在这个坐标系下进行测量,测量结果如下:
在Unity 3D场景中,需要建立分别建立代表虚拟屏幕和Kinect的游戏物体,将他们的世界位移和朝向设置为测量得到的数据。在Kinect游戏物体下建立一个空的子游戏物体,用于代表观察者的头部位置。
当新的头部位置数据到达时,通过设置GameObject.transform.localPosition属性修改这个物体的位置。在计算准备阶段,通过访问GameObject.transform.position属性获取其世界坐标。
3.3 头部相关透视投影的实现
3.4 双眼立体视觉的实现
本文的演示程序采用红青分色来实现立体视觉。具体做法是,在Unity中,为每一块屏幕分别创建两个摄像机,分别模拟左眼和右眼。编写一个图像着色器,其作用是将摄像机渲染出的图像只保留部分通道的颜色输出后叠加到帧缓存中。将这个着色器脚本应用到摄像机上,设置为左摄像机只保留红色通道,为右摄像机保留蓝色和绿色通道。观察者在佩戴合适的红青分色眼镜后,就可以从渲染出的画面获得双眼视差立体效果。
3.5 演示系统运行结果
经过测试,本文的头部相关透视算法配合双眼视差立体渲染获得良好的立体效果,系统的精确度、延迟也在合理的范围内。
注意,图4中的所有虚拟物体越过屏幕被放置在了外面,造成了一种“悬浮”于空中的效果,这得益于两块垂直放置的投影屏幕有效地增加了可视面积。
3.6 存在的问题
在本系统中,摄像机的近裁剪平面被设置成了0.2,这意味着物体在离人眼距离小于0.2米的时候才会被裁剪。但是,过小的近裁剪平面导致了更大的深度分布范围,在深度缓存数据浮点型精确度有限的条件下导致深度方向分辨率下降,在实际应用中的表现是,造成几何体出现近邻面的深度冲突(Z-Fighting)、基于Shadow Map技术的阴影质量下降等问题。
4 结论
本文研究了基于头部相关的透视实时立体图形渲染算法,一个透视投影立体渲染虚拟现实系统被搭建出来并经过测试,这个系统使用了Kinect for Windows作为头部捕捉设备,使用Unity 3D作为渲染引擎。为了增加可视面积,制造更好的“出屏”效果,采用了两台投影互相垂直投影的做法,配合红青分色双眼立体渲染,取得了更优秀的立体图像效果。未来需要研究的内容是如何解决深度方向分辨率下降等相关算法。
参考文献:
[1] 三维立体显示技术研究新进展, 郑华东,于瀛洁,程维明, 光学技术[J],2008,34(3):426-430
[2] 蒲栋,基于平透视投影变换的单目视觉头部姿态估计[D], 中南大学硕士论文,2014。
[3] Arthur K W. 3D task performance using head-coupled stereo displays[D]. university of british columbia, 1993.
[4] Cruz-Neira C, Sandin D J, DeFanti T A. Surround-screen projection-based virtual reality: the design and implementation of the CAVE[C]//Proceedings of the 20th annual conference on Computer graphics and interactive techniques. ACM, 1993: 135-142.
[5]金玺曾,Unity3D\2D手机游戏开发[M],北京,清华大学出版社,2014。
[6] 王雅懿,基于Kinect人體识别技术的虚拟现实交互方法的应用研究[D], 北京工业大学硕士论文,2014。