基于flash的360虚拟现实引擎实现

3次阅读

flash 360 度 3D 虚拟实境(cubicVR)实现原理

flash 的 3D 虚拟实境最早源自于德国的 flash 图形学大牛 andre.michelle 在其 labsite:lab.andre-michelle.com 上发表了一篇关于虚拟实境的文章,并提供了一个实例(NaN sourcecode). 为了深入虚拟实境,在接下来的 2 个月里我陆续找到一些 cubicVR 的源文件并尝试破译了一些源码,我同时尝试开发了一个简单的 flash3D 引擎以及图片 3D 拉伸算法,所有这些的思想均来自于 andre-michelle 在其日志中提到的一些 idea. 现在在这篇文章中所用的实例依然是我对 andre 早期版本的整理,虽然目前我开发的新版本有更好的结构以及执行效率,但此版本的编程思想更通俗易懂。我想利用这个假期时间开发出 flash 球型虚拟实境,使它变得更真实。

在 flash 里部署 3D 虚拟实境无疑是一个革命性进步,我们再也不用去安装 java 虚拟机和 QTVR 了,事实上,在基于 flash 的可编程矢量图形界面基础上开发出来的虚拟现实可以通过创新的用户界面以达到完美的用户体验。city8.com 既采用这种技术来部署他们的全景体验城市地图。

demo: 鼠标拖拽以转换 camera 视角

原理:

点透视与投影

通过 1 点透视来产生远小近大的变化以产生空间感,在 cubicVR 中,设想观察者 camera 在一个正六面体中央,通过一点透视来计算每个面的在空间投影中的位置,以产生透视效果。

demo: 没有导入透视方程的情况:

细分贴图

flash 的 matrix 类只支持 2D 图形变换:切变、缩放、平面位移。位图无法实现 3D 变换,这与 openGL 不同,openGL 只需要在定义多边型顶点和贴图法线,位图就会自动贴到一个面片上,而且整个贴图过程完全由 GPU 完成。而在 flash 中必须使用细分贴图的方法来欺骗人们的眼睛,既:将一张图片细分为 n 张小的三角面片,再将小三角面片进行平面切变,正因为如此,flash3D 一旦涉及贴图必然导致大量占用 cpu 运算资源。

细分贴图的 demo:
http://godson.blueidea.com/archives/2006/3708.shtml

消隐算法

如果没有消隐算法,那么观察者只能看到离屏幕最近的面,而不能看到整个 3D 空间,理论上消隐算法有 3 个步骤:1 在一个六面体中,面法线与视锥体夹角大于 180 度则应设为不可见,2 在同一个像素上,只显示与 camera 最近的多边形(Zbuffer 算法),3 投影在屏幕以外的多边型不可见,但这三种算法非常占用 cpu 资源,andrew 设计了一种更简单的算法:1 多边形的中心与 camera 重合,在 camera 坐标系中 Z 值 <0 的多边形不可见,2 投影在屏幕以外的多边型不可见。

正文完