一种基于FlashVR的三维微型场景网络发布引擎的制作方法

文档序号:6483153阅读:207来源:国知局
专利名称:一种基于FlashVR的三维微型场景网络发布引擎的制作方法
技术领域
本发明涉及虚拟现实(Virtual Reality)技术和互联网络发布技术,具体是一种 基于FlashVR的三维微型场景网络发布引擎。
背景技术
基于Web的虚拟现实系统是基于桌面VR系统在互联网上的延伸,即实现三维物体 和场景在网络上有限带宽的范围内传输,从而呈现在千里之外的网络用户面前,使二维的 网页变成一个接近真实的三维场景。它是互联网技术和虚拟现实技术发展的必然产物。基 于桌面VR系统的可分为两类基于图像的桌面VR系统和基于模型的桌面VR系统。目前针 对基于图像的桌面VR系统的网上虚拟现实技术主要有VRML技术、Java3D技术、Viewpoint 技术、Cult 3D技术等。VRML技术是一种网上三维语言,,通过节点进行三维描述,,节点又由域和事件构 成域定义节点的属性;事件定义用户与场景之间的交互,使虚拟世界具有动感。在节点间 创建通道(Route),通过发送一个事件使一个节点控制另一个节点。VRML文件是虚拟空间 的文本性描述,可采用文本编辑器、VrmlPad(试用版)或由能够生成VRML三维空间的工具 可视化地生成。VRML的优点是简单、方便、易用,可以直接嵌入到HTML文件中去,可以利用 Script节点可以通过Java或者JavaScript语言编写的程序脚本来扩展其功能。缺点是画 面不够生动逼真;VRML语言功能目前还不是很强,与Java和JavaScript语言交互较难掌 握等。Java3D技术是Java语言在三维图形领域的扩展,是一组应用编程接口(API)。它 除具有VRML具有的可交互性、支持多媒体和节省网络带宽外,还具有简化三维应用程序的 开发、更强的交互性、同其它Java APIs有良好的结合性等优点。Viewpoint和Cult 3D技术三者拥有互动性强、真实度高的共同特点。Cult3D技 术的内核是基于JAVA,它可以嵌入JAVA类,利用JAVA来增强交互和扩展,它对硬件要求相 对较低,即使是低配置电脑用户也能流畅浏览Cult3D作品。利用Viewpoint公司开发的 Viewpoint技术可创建照片级真实的3D图像,在窄带环境里也可发挥逼真的效果。但遗憾 的是,这两种技术工具的使用都需要付出比较昂贵的注册费用,在我国的应用受到一定限 制。另外,OpenGL, Direct3D也常用来开发网上的虚拟现实系统。但它们有一个共同 缺点编程较难掌握,致使很多网上虚拟现实开发爱好者望而却步。参考文献[1]《虚拟现实技术》(美)Grigore C. Burdea,(法)Philippe Coiffet 著;魏迎 梅,栾悉道等译北京电子工业出版社.[2]基于WebVR的变电站通信监控系统设计与实现[J],华北电力大学学报,2005, vol32, No. 3,85 88.[3]虚拟现实中基于图形与图像的混合建模技术[J],中国图像图形学报,2001,6(1) 96 101.[4]Web3D虚拟现实技术概况与分析比较[J],科学之c友,2008,5(14) :130 131.[5]基于Web的虚拟现实的开发与应用,计算机应用研究[J],2003,(3),92 95.[6]三维图形引擎技术的研究.(硕士学位论文).北京北方工业大学,200
发明内容
本发明在综合运用虚拟现实(Virtual Reality)技术、互联网络发布技术、多维 可视化技术等研究成果基础上,结合Flash软件中空间表达的方式,利用Flash脚本语言 ActionScript 3. 0实现了一种基于FlashVR的三维微型场景网络发布引擎。实验表明,该 引擎实现了对3dSmax或者maya等三维建模工具导出的三维模型文件的实时渲染和互动操 作,最终生成相应的.swf文件,并将.swf文件嵌入到浏览器中,无需用户下载额外插件即 可实现三维模型的发布;同时,在对部分通用技术细节进行整理和封装的基础上,形成一个 面向FlashVR应用的应用程序接口函数,使得FlashVR开发人员不必再关心底层技术的实 现细节,大大减少开发人员的工作难度和工作量,缩短开发周期。本发明的技术方案,设计思路如下1)根据Flash软件中对图形的表达方式,设计三维图形在Flash中的数学表达结 构;2)根据基础3D流水线、光照着色和纹理映射理论,确定三维场景视图生成的一般 步骤3)在上三项理论基础上,基于ActionScript 3. 0设计与实现引擎渲染模块。本发明的有益效果在于基于ActionScript 3. O编写一套三维图形类库,实现了 Flash在3D领域的拓展,优化了 3D在互联网上的发布方式,在Flash Player中播放,具有 体积小,与用户交互能力强,效果逼真的特点,提高了网上漫游的速度和质量,并可以无需 下载插件即可在网络上进行三维物体、三维场景的发布,为用户带来一种全新的体验。




图1坐标系的表达 图2三维平移 图3三维变化流水线 图4聚光灯
图5利用单位向量U、ν和η定义的右手观察坐标系 图6斜平行投影
图7图片相互部分遮挡关系示意图
图8纹理坐标
图9纹理映射
图10纹理映射到正方体
图11遮挡关系异常
图12上海普润房产别墅展示
图13四川灾区板房展示
具体实施例方式13D数学理论1. 13D 坐标系定义坐标系如图1,其中,χ轴和y轴分别为横向和纵向,ζ轴以你看屏幕的方向为 正方向。但是因为Flash CS3并不支持3D绘制,所以ζ轴并不存在,但是在3D空间里,离 得人眼越远的物体,它的大小就越小,那么它在χ和y轴上的移动就越缓慢,因此我们可以 利用物体大小变化来模拟远近的效果。3D空间以坐标系原点为中心,原点的坐标我们用Point (X,y,ζ),(0,0,0)来表示。 在Flash 2D中,原点存在舞台的左上角Point (x, y),(0,0),为了方便绘制物体,我们把3D 空间的原点移动到舞台中心,即数学坐标中心。
1. 2 二维数描述坐标平面上的点(X,y)。 1. 3UV数描述贴图在模型上的X,y位置,形同:维数,但根据贴图坐标命名为u,
Vo
1. 4三维数就是向量数,描述在三维空间里的相对位置(X,y,ζ)。
1.5三维矩阵矩阵是若干数字、函数或数值表达式的长方形阵列,这些称为该矩
MooAZoiΜθ2Μθ3MioMnMnMnMwMnMnMiaMyiMyiM33
阵的元素。单行或单列的矩阵表示一个向量,通常矩阵可以看作为行向量或列向量的集合. 运用了 4*4或4*3的矩阵,它与各种运算相关,是最重要的数学类。
这里主要讨论4x4矩阵,排列形式如下 M =可得一个三维位置在齐次坐标中表示为四元向量。因此,不论何种几何变换操作, 都是一个左乘坐标向量的4*4矩阵。和二维的一样,任意矩阵变换序列,通过依序合并每一 个变换矩阵而得到的一个矩阵表示。变换序列中每一个后继从左边去和以前的变换矩阵合 并。1. 5. 1三维平移如图2,在三维齐次坐标表示中,将任意点P = (x, y,ζ)经平移距离tx,ty,tz,到 点 P,= (x,,y,,z,),x,= x+tx,y' = y+ty,z' = z+tz。利用变换向量 T = (tx,ty,tz)对 某点进行平移变换.我们可以利用矩阵形式来表达三维平移操作,如下
X'
y'
ζ· 1
0 0 0
00txX10tyy01tzXZ0011
或 P,= Τ*Ρ 1.5.2三维缩放
缩放变换的矩阵为 Mx = 1. 5. 3绕X轴、y轴、ζ轴旋转的旋转矩阵分别为
(Θ为绕各个坐标轴旋转的角度)对象的平移、缩放、旋转通过平移定义该对象的各个点然后在新的位置重建该对 象而实现。对于由一组多边形表面表示的对象,可以将各个表面的顶点进行相应的平移,然 后重新显示新位置的面。1. 6四元数将四元数表示用于旋转变换是获得对于给定轴旋转的一种更有效的方法。它比 4x4矩阵需要更少的存储空间,并且更容易写出变换序列的四元数过程。这对于需要复杂运 动序列和给定对象两个位置的运动差值显得尤其重要。描述四元数的一个方法就是把它看作是一个有序对,由一个标量部(scalar part)和一个向量部(vector part)组成q = (s,ν)也可以把四元数看成为高阶复数,带有一个实部(标量部分)和三个虚部(向量 的元素)。绕经过原点的任意轴旋转,可以通过建立有以下标量和向量部的四元数 其中,U是沿所选旋转轴的单位向量,θ是绕此轴的指定旋转角。任意点P绕该四 元数旋转,可以用四元数符号表示为P= (0,ρ)这里,点的坐标为向量部P= (x,y,z)。然后点的旋转由四元数运算实现P' = qPq-1其中q—1 = (s,-ν)是等式中所给出的标量和向量部组成的单位四元数q的逆变 换。这一变换产生了下面的新四元数
Ρ,=(0,ρ,)该有序对的第二项是旋转的点位置P’,它由点积和叉积表示为P ‘ = s2p+v (ρ · ν) +2s (ν X ρ)+ν X (ν X ρ)参数8和ν由等式给定其值。很多计算机图形系统利用向量计算中的有效硬件实 现来执行快速的三维对象旋转。2基础3D图形流水线三维场景视图的计算机生成步骤首先,需要在场景中确定一个观察位置。根据要 显示场景的前、后、侧、上或底来选择观察位置。也可以在一组对象的中间,甚至在一个对象 如一个建筑物或一个分子的内部选择一个观察位置。然后,要确定照相机的方向。照相机 朝着哪个方向及如何绕视线旋转照相机以确定照片的向上方向。最后,裁剪窗口确定如人 观察范围的视景。图3给出了建立三维场景以及将场景变换到设备坐标的一般步骤。在世界坐标系中建立好场景模型以后,将场景描述转换到选择的观察坐标系。观 察坐标系定义了观察参数,包括投影平面(观察平面)的位置和方向,然后在投影平面上定 义与照相机对应的二维裁剪窗口,并建立三维裁剪区域。该裁减区域称为观察体,其形状和 大小依赖于裁减窗口的尺寸、投影方式和所选的观察方向的边界位置。投影操作将场景的 观察坐标描述转换为投影平面的坐标位置。对象映射到规范化坐标系,所有在观察体外的 部分被裁剪掉。裁剪操作可以在所有与设备无关的坐标变换(从世界坐标系到规范化坐标 系)完成之后进行。这样,坐标变换可以合并以便最大限度地提高效率。定义3D图形在屏幕上的显示,实际上是一个将离散的模型和关卡放置到适当的 空间位置、再从人眼所观察到的角度将它们投影到正确的平面位置、最后填充像素点的过 程。因此,3D元素要经过一系列的变换过程,这个过程称为3D流水线,如图3所示。3光照着色和纹理映射理论为了让模型看起来更加真实,可以给场景配上一个或者多个光源。同时还可以选 择是否使灯光影响几何体的外观,几何模型可以有与其每个顶点相关联的颜色。通常光照 计算是在世界空间中进行的。如果对光源进行视点变换,在观察空间中会得到同样的光照 效果。这是因为即使将参与光照计算的所有实体都变换到同一个空间中,光源、相机以及 模型之间的相对位置依然保持不变。3. 1 颜色计算机屏幕上的颜色是使用RGB或颜色索引来表示。RGB颜色模式很常用,在这种 模式下,每个分量被表示为0 1或0 255的值,例如红色就表示为(255,0,0)。3. 1. 1颜色加法当两个数相加大于255时,就会存在溢出。所以我们将颜色Cl和C2相加后,对每 个分量进行截取:Csum = CI+C2 = (MAX(rl+r2,255),MAX(gl+g2,255), MAX(bl+b2,255))其中MAX(x,y)返回χ和y中较大的那个。这样就保证了分量的值不会超过255。3. 1. 2颜色调制颜色调制实际上就是颜色乘法,这种调制方式是调制颜色的亮度,也需要避免溢 出。如=Cmodulated = s*cl 二 (s*rl,s*gl,s*bl),其中S可以是0到无穷大的任何值。缩放 因子为1.0时,颜色保持不变;缩放因子小于1.0时,颜色亮度降低到原来的5倍;缩放因子 大于1. 0时,颜色亮度将增加到原来的5倍。
7
3. 1. 3 AlPha 混合AlPha混合指的是将多个像素颜色相加,得到目标像素的颜色,混合时将指定每个 源像素的百分比。Alpha混合用于模拟透明和其他效果,如阴影。其工作原理根据混合 因子(通常被称为AlPha)将多个源像素混合起来,并将结果作为目标像素的颜色值。3. 2光照模型优秀的光照引擎应该支持无穷多的各种类型的光源,而光照计算应针对每个像 素,并考虑所有材质属性,但实际上并不是这样的。即使是最高级的3D加速器也只支持不 多的几种光源,我们不能执行完美的像素光照计算,同时通常只支持无穷远光源和点光源。 另外,所有的光照计算都只在三角形顶点上进行,然后使用插值来平滑表面的光照。下面介 绍几种常见的光源类型。3. 2.1定向光源定向光源是没有确切位置的光源,它离场景非常远(无穷远),其光线平行地照射 到表面上。定向光源还具有这样的特征其光照强度不会随距离而衰减,因为光线已经传播 了无穷远的距离。然而,定向光源仍然有强度和颜色。要定义定向光源,只需指定其初始颜 色和强度。用CIxxx 二来表示光源颜色,用COxxx功来表示光源的初始强度,其中XXX表示光 源类型。定向光源的强度为I(d)to,= I0dir*CIdir。3. 2. 2 点光源点光源是使用3D空间中的一个点来模拟的,点光源实际上被模拟为现实生活中 的点光源,如电灯泡。因此光照强度随光源离表面的距离S的距离衰减,而衰减是使用三 个因子来模拟的常量衰减因子K。、线形衰减因子K1和二次衰减因子K,。用d表示位于点 P处的点光源和表面S上的点S之间的距离,则光照强度和距离之间的关系如下i(d)point = (IOpoint^cipoint)/(Κ,+K^d+Vd2)其中 d = Ip-S3. 2. 3 聚光灯聚光灯的计算开销非常高。现实生活中的手电筒就被模拟为聚光灯。图4描述了 标准的聚光灯模拟方式,其中聚光灯位于点P处,方向向量为1,光线照射到表面S上的点 S 另外还有一个表示聚光灯照射范围的圆锥。这个锥体由两个区域组成内部区域和外部 区域,内部区域通常被称为本影,外部区域被称为半影。在本影内,光照强度是恒定的,但过 渡到半影中后急剧衰减。对于模拟聚光灯的衰减使用如下算法情形1 如果光源方向与光源到点s的向量之间的夹角大于外圆锥(半影)的角 度,则不对该点执行光照计算;情形2:如果光源方向与光源到点S的向量之间的夹角小于内圆锥(本影)的角 度,则使用100%的聚光灯强度,但根据距离对其进行衰减;情形3:如果光源方向与光源到s的向量之间的夹角大于内圆锥(本影)的角 度,但小于外圆锥(半影)的角度,则根据距离和减弱公式对强度进行衰减定义聚光灯,先 指定位置P、方向向量1和两个角度a和沪,它们分别定义了内圆锥和外圆锥)。光源颜色
ClspOtlight,禾口弓虽貞 IOspotlight如果角度θ大于Φ/2,聚光灯根本就照射不到相应的点;如果θ小于Φ/2,相应 的点位于照射范围内,但内圆锥中不考虑减弱,只在外圆锥中考虑减弱。还要指定一个控制 聚光灯总体光照强度的指数因子用Pf表示。最后,由于聚光灯属于点光源,需要考虑光照强度随距离衰减的问题,因此需要指定衰减因子K。、K1和K,。这样计算聚光灯光照强度的公式如下情形1 θ大于Φ/2 (位于半影外,根本照射不到)I(d)sp。tlight = 0情形2 θ小于Φ/2(位于本影内,根本照射不到)I(d)p。int = (IOpoint^Clpoint)/ (Κ,+K^d+K^d2)情形3: θ小于Φ/2并且θ大于a/2 (位于半影内) "d、 二Clspotl咖 t (cos^-cos(^/2))pf
、JspotUght - Kc +K^d+^ *d2 (cos(a/2)-cos(^/2)) 从上面的分析过程可以看到,使用的模型非常复杂,如果是渲染离线3D环境,可 以使用这么复杂的模型;但如果是实时地渲染3D模型,则没有必要使用这么复杂的模型。 在实时渲染中,粗略地模拟聚光灯的模型也能够满足需要。即不将锥形划分成强度不减弱 的本影和半影,而是将整个锥体内的减弱因子都设置为cosa,同时考虑指数因子。简化后的 模型 3.3顶点象素着色3. 3.1固定着色固定着色,是最简单的模型,不考虑任何光照效果,没有环境光、散射光等,只是使 用某种颜色将多边形绘制为实心的。因此,固定着色根本不考虑光照模型,只是根据多边形 颜色的索引或RGB值绘制它。3. 3. 2恒定着色恒定着色指的是根据多边形上某个像素的光照情况对整个多边形进行着色。也就 是说,假设多边形是由一种材质构成的。我们只处理三角形,在每个多边形中,每个点的面 法线都是相同的,因此对于每个多边形,只需对一个顶点执行光照计算,然后根据计算结果 对整个多边形进行着色。这就是恒定着色,也叫面片着色。对于由平面组成的物体,这种方 法是可行的,但对于由曲面组成的物体,使用多边形对其进行近似时,这种方法导致物体看 起来是由多边形组成的。如果使用Gouraud或Phong等平滑着色方法,平面多边形看起来 将是平滑的。因此我们应该根据不同属性的物体采取相应的着色方法。3. 3. 3G。uraud 着色Gouraud着色可以让表面颜色平滑的变化,使其看起来是平滑的,对于小平面组成 的物体结果会很糟糕,但对于球体,效果很好。Gouraud着色算法对于每个多边形都计算其 所有顶点的颜色和强度。对于共享多个顶点的多边形,对其法线进行平均。然后执行光照 计算,得到每个顶点的最终颜色。也就是说,不使用单种颜色来渲染多边形,而是根据每个 顶点的颜色,使用插值来计算多边形内部各点的颜色。Gouraud存在的缺点是着色必须在光 栅化每个多边形时进行,因此在屏幕空间中执行,存在透视变形。只是肉眼并不能分辨出这 种变形。另一个问题,在光栅化期间需要执行插值算法,这种算法的开销很高。4引擎渲染模块的设计与实现;
场景渲染是三维引擎中最重要的子模块之一,负责实现基本图元的绘制,光线处 理和纹理处理等,实际上是三维真实感图形的再现过程。在许多应用领域都对场景的实时 性有很高的要求,如果达不到一定的显示速率,就会丧失实际应用的价值。渲染模块需要完 成整个多边形处理流程,包括多边形的位置计算与遮挡显示、物体剔除、隐藏面消除、光照 和着色、纹理映射等,直到最后将每个像素的RGB信息送入显示缓存。它的效率直接决定引 擎的效率和质量。4.1基本3D数据结构4. 1. 1 点根据前面的数学基础,创建一个顶点过程如下function vertex3d(χ, y, ζ, scale = 1):Object{ var point3d = new Object ();point3d. χ = χ ;point3d. y = y ;point3d. ζ = ζ ;point3d. scale_point = scale ;//scale_point 代表这个点在投射到 2D 平面 上后位置缩放的比率。return point3d ;}4. 1.2 多边形由于三角形最容易被渲染,所以本引擎仅支持三角形,最终所有的模型都用三角 形来表示。根据顶点和多边形的组织方式,定义了一种基于顶点列表多边形结构,和另一个 种包括物体的每个多边形的顶点信息的结构,在光栅化阶段可以将该其传递给光栅化器。
0128]基于顶点列表多边形结构
0129]var vertexes =
0130]{
0131]new Vector (-60,-60,0),
0132]new Vector (60,-60,0),
0133]new Vector(60,60,0),
0134]new Vector(-60,60,0)
0135]};
0136]with(polygon, graphics)
0137]{
0138]clear ();
0139]IineStyle (· 5,0x000000,0);
0140]beginFill(0x6A83A6,l);
0141]draw_face (pro
, pro [1], pro [2]) ;//绘制第一个三角形
0142]endFillO ;
0143]beginFill(0xBD5E53,l);
0144]draw_face (pro [3], pro [2], pro
) ;//绘制第二个三角形
endFillO ;}4. 1.3 物体3D引擎中,物体通常由一组多边形构成,我们采用让物体本身提供存储局部坐标、 世界坐标和相机坐标的空间,同时在流水线中提供存储这些坐标的功能。物体数据结构如 下
0149]var colIadaID!Dictionary ;
0150]var colIadaIDToObject: Object ;// 物体 ID
0151]var filename:String ;//物体名称
0152]
0153]
0154]
0155]
0156]
0157]
0158]
0159]
0160] 0161] 0162]
0163]
0164]
0165]
0166]
0167]
0168]
0169]
0170]
0171]
0172]
0173]
0174]
0175]
0176]
0177]
0178]
0179]
0180] 0181]
var UseMaterialTargetName:Boolean = false ; var DEFAULT_LINE_C0L0R:uint = OxffffOO ; var DEFAULT_LINE_ffIDTH:Number = 0 ; var DEFAULT_TGA_ALTERNATIVE:String = " png"
var forceCoordSet:int = 0 ; var C0LLADA: XML ;// 物体类型 public var texturePath:String ;//贝占图足各@ protected var_objectToNode:Object ;
var_channe1sByTarget:Dictionary ; var_geometries:Object ; var_queuedMaterials:Array ; var_textureSets:Object ; var_channe1s:Array ; var_skins:Dictionary ; var_numSkins:uint ; var_rootNode:DisplayObject3D ;
物体属性
protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected protected 4. 1.4相机
var_currentFrame:int = 0 ; var_currentTime:int ; var_totalFrames:int = 0 ; var_startTime:Number ; var_endTime:Number ; var_isAnimated:Boo1ean = false ; var_isPlaying:Boolean = false ; var_autoPlay:Boolean ; var—rightHanded:Boolean ; var_controlIers:Array ; var_playerType:String ; var_loop:Boolean = false ; var—bindVertexInputs:Dictionary
11
定义UVN相机数据结构如下public function Camera3D{camera Type ;var fov: Number ;var near: Number ;var far: Number ;var camera Focus:Number ;var camara Z: Number ;var camara Zoom:Number ;var clip content:Boolean ;}4. 2构建世界坐标系场景与全局坐标生成相关的信息包括初始静止的坐标和运动变换矩阵。两者分别从 man. asf 禾口 man. amcm 中导入。无论是初始静止状态下的坐标,还是每一帧的运动变换数据,即都是局部的数据, 须要转化成全局的数据。4. 3局部坐标与全局坐标的转变从局部坐标到全局坐标的转换,必须局部坐标系下的变换矩阵乘以父节点在更上 层节点上的变换矩直乘到根节点在全局坐标系下的变换矩阵。公式如下
"0" 在求整个层次模型中所有节点的全局坐标,如果已知父节点的全局坐标,需要将 子节点的变换矩阵乘以父节点的全局坐标。整个层次模型是一棵树,因此,我们可以使用广度优先遍历(BFS)的方法来求得 每一关节的全局坐标。算法设计如下从根节点(root)开始,先求出根节点的全局坐标。 根节点是比较特殊的节点。它负责整个人物的旋转和平移,所以它是用他的局部坐标(0,0, 0)先乘以其旋转矩阵再乘以其平移矩阵,以此来求得它的全局坐标。然后从根节点开始,遍 历其所有子节点,利用父节点的全局坐标乘以子节点的平移矩阵再乘以其旋转矩阵,得到 子节点的全局坐标。遍历完子节点后,再遍历下一层的子节点。以此类推,直到遍历到叶子 节点位置。4. 4照相机的UVN坐标系统在图5中,由于观察平面法向量N定义了 ζ触轴方向且观察向上向量ν用来获得 珠,轴方向,我们只要再确定尤“酬轴方向即可。计算ν和N的叉积得到U方向并形成右手 观察系。N和U的叉积可以生成与N和U都正交的调整后沿正向孺轴的ν值。至此,我们得 到右手观察系的一组单位轴向量。
ν = VXn = (ux, vy, uz)4. 5世界坐标系向观察坐标系转换假设观察坐标系原点在世界坐标系中的坐标P(X(I,y0, Ztl),将其移动到世界坐标系 的原点的变换是 T = 将观察坐标系重合到世界坐标系得旋转变换矩阵使用2. 4中求得的单位向量u、v
和η来获得。该变换矩阵为 R 将两个矩阵相乘即获得坐标变换矩阵 M = R T =变换矩阵M将世界坐标系下物体描述变换到观察坐标系。4. 6投影变换在这里,我们使用的是平行投影。由于投影线的方向和观察平面法线向量之间的 关系任意,我们使用斜平行投影的方法。如图6所示,观察坐标系上的一点P (X,y,ζ)投影到位于观察ζ轴Zvp处的观察平 面的(x,y,Zvp)。位置(x,y,Zvp)是相应的正投影点。从(x,y,z)到(Xyyp^vp)的斜平行 投影线与投影平面上连接(xp,yp,zvp)和(x,y,zvp)的线之间的夹角为a(0° < a < 90° )。 观察平面上这条长度为L的线与投影平面水平方向的夹角为Φ (0° < Φ < 360° )。设P(x,y,ζ)的投影向量 Vp = (Vpx, Vpy, Vpz),其中 Vpy/Vpx = tan Φ。由三角形 变换得出YpJYpz = Xp-XZZvp-ZVpy/Vpz = Yv-YZzvp-Z利用上式求得的斜投影向量参数,我们可以求得斜平行投影矩阵 M,
obligue
ι ο 一Vp^/ z^px/
O 1z^py/
0 0 1 0 0 0 0 14. 7观察坐标系向规范化设备坐标首先求得三维人物的包围盒。遍历三维物体坐标,求出xwmin、XWfflax, ywfflin, ywfflax, ZWfflin, zwmax。介于六者之间的平行六面体就是包围盒。然后计算规范化变换矩阵
_ -)
0 2
Mol
Mgue
^max "^min
0 0
^max-Jwmin 0
0
-2
ZHL -ZWm
^^maxnun-房min^max凡ax^max+ ^rninZW -ZW max min
0 0 0 14. 8规范化设备坐标映射到设备坐标规范设备坐标系下视口左下角的坐标为(-1,-1),将其移动到(0,0)的变换矩阵 为 T =
矩阵
1 0 1 0 1 1 0 0 1
规范设备坐标系下视口的长、宽皆为2,将其放大到设备坐标系下视口大小的变换 5 =
Ool O ^o
^o O其中,w表示设备坐标系下视口的宽度,h表示设备坐标系下视口的宽度。由于在设备坐标系下,(0,0)点位于视口的左下角,Y轴朝上。而在Flash里面, (0,0)点位于视口的左上角,Y轴朝下。所以,我们必须进行变化χ,= X,y,= h-y.4. 9遮挡关系处理遮挡关系的处理根据参数ζ值来所处的深度。如果A处的Z值大于B处的Z值, 则A挡住B。
14
如图7在复杂的遮挡关系群中,可能出现的环形部分遮挡关系。即A部分遮挡B, B部分遮挡C,C部分遮挡A的情况。为处理该情况,传统的做法是进行图像切割,消除遮 挡环。但是,我们开发使用的是Flash,图像的切割会大大降低系统的性能,所以,我们不采 用图像切割的方法。我们采用优先级判断的办法。在计算出所有遮挡关系之后,我们加入了优先级的计算。每一个骨骼都有一个固 定的被遮挡优先级的值。我们计算每一块的优先级的值。如图7情况,设A的被遮挡优先级为5,B的为3,C的为1。由于A遮挡B,A的优 先级为3,B遮挡C,B的优先级为1,C遮挡A,C的优先级为5。最终,优先级,我们认为C遮 挡B遮挡A。遮挡消隐效果的实现,我们使用的是Flash的内部机制。在Flash提供的图像容 器中,深度索引值高的图像和深度索引值低的图像重叠时,深度索引值高的盖住深度索引 值低的。基于此原理,我们为物体建立一个总的图像容器,每一个骨骼图像以它的Z值为深 度索引值,这样就实现了遮挡效果。4. 10裁剪的处理二维图像的裁剪,我们并没有用任何算法处理,而是直接利用Flash内部机制实 现。在Flash中,每一个图像容器,它都有一个幕布(mask)属性,你可以指定幕布的大小, 默认情况下,幕布是和容器一样大小。一旦你指定了幕布的大小,处于幕布内的图像会在重 绘时渲染,而幕布范围外的图像则会自动被裁剪。4. 11纹理映射原理纹理网可以理解为是物体的外表图案。在3D场景中,它极大的增加了物体的真实 性。例如,我们可以在显示屏上画一系列组合的矩形来表示一堵墙,但这样的墙看起来光秃 秃的,颜色也不真实。如果我们再在上面加上一些划痕,磨损,苔迹,还有标语,使它看起来 更像一堵真实的墙,这就是纹理。物体的这些外表图案是存储在一些二维的图片中的,纹理 即是指这些二维的图片,它一般采用bmp或JPg的图片格式。纹理上的每一个像素称为纹理 像素。理论上任何尺寸的纹理都可以,但是为了提高效率,纹理最好是正方形的而且它的边 长最好是2的η次幂的形式,例如16x16,32x32,64x64,128x128等是最有效率的尺寸。如 果可以的话,纹理越小越好。通常用纹理坐标标识一张纹理图,纹理坐标的作用是在纹理上 指定一个点,因为纹理是ZD的,所以我们仅需要两个值U和V。U是横轴的值,而V是纵轴 的值,u和ν的取值一般归一化在0到1之间,左上角是(o,0)右下角是(1,1),U和V的取 值也可以是0到2的幂减1。下面的图8演示了一个纹理和它的几个点。在场景中,把纹理应用到三维对象上,这个过程就叫做纹理映射。在此过程中,纹 理坐标会被映射到顶点上,所以,顶点将额外增加两个值U和V。对于如图9所示的正方体,下面列出了每个顶点对应的纹理坐标(顶点序号=(U, V))0 =(0,1)1 = (0,0)2 = (1,1)3 =(1,0)4 = (0,1)5 =(0,0)
6 =(1,1)7 = (1,0)8 = (0,1)9 =(0,0)10 = (1,1)11 =(1,0)
12 ==(0,1)13 = (0,0)14 = (0,1)15 ==(0,0)16 = (1,1)17 =(1,0)映射到正方体上的纹理效果如下图10所示由于纹理图和多边形的大小不一样,假如要将宽1个像素高8个像素映射到宽1
15个像素高为η的多边形上,其中η为任意形在纹理图上的采样比例,其计算公式为采样比
例二纹高度。首先假设η为4,在这种情况下,根据采样比例的计算因此可以在纹理图的每两个 像素中采集一个。也就是说,每移动1个像素,必须在纹理图中移动2个像素,因此,6位置上 的像素并将它们分别映射到目标多边形的0,1,2,然后假设η为14,那么,采样比例为8/14 =0. 57。制每个像素时,当前采样点与前一个点的距离为0. 57个0到13,对应的采样点序 列如下样本0:0. 57 样本 1 :L14 样本 2 :L71样本4:2. 85 样本 5 :3. 42 样本 6 :3. 9样本8:5. 13 样本 9 :5. 7 样本 10 :6.样本12 7. 41 样本 13 -J. 98对采样点进行截尾,结果为(0,1,1,2,2,3,3,4,5,被采样两次。整个算法过程用伪代码形式描述如下{H设置扫描线起点的纹理坐标
//沿扫描线从左到右进行插值for (从左到右的所有像素){//读取纹理的颜色H计算下一个像素的纹理坐标}}4. 12 Z 缓存Z排序的提出就是为了确定多边形的前后绘制顺序,其算法思想是,根据渲染列 表中的每个多边形的Z值将多边形按照从前到后的顺序排列,然后按照这样的顺序绘制他 们。如果多边形比较小而且不是凹的,这种算法效果将很好也很容易实现,但是在某些情况 下,如图所示,将导致异常情况发生。因此我们使用像素级的ζ排序算法,及ζ缓存。其算 法思想和Z排序的区别在于Z排序时对每个多边形的Z值进行排序,而ζ缓存是针对屏幕 上的每个像素点进行ζ排序,这样并不存在任何顺序不正确的情形。对于大小为MXN的屏幕,创建一个ζ缓存zbuffer [x, y],其中包含每个多边形中 每个像素被光栅化或扫描转换后的ζ值。ζ缓存的大小为MXN,被初始化为最大可能ζ值 (实际上是无穷大)。下面描述ζ缓存算法过程如下for (渲染列表中的每个多边形)1.对其进行光栅化,生成Xi、yi、Zifor (每组 XpyiJi)2. if (Zi < zbuffer[xi; Yi]){// 将 Zi 写入到 ζ 缓存中,即 zbuffer[Xi, Yi] = Zi,Il然后将该像素显示到屏幕上Plot (xi; Yi)
}对于多边形各个点上的ζ值的计算我们将采用ζ坐标插值的方法来实现。具体插 值算法和前一节介绍的Gouraud着色插值算法是相同的。为了创建ζ缓存系统,建立ζ缓 存的数据结构如下UCHAR^zbuffer ;//指向存储空间的指针int width ;//宽度int height ;// 高度int size ;// 大小对ζ缓存的操作包括创建、清空和填充、删除等。每种操作都提供一个函数加以实 现,其原形如下int Creat Zbuffer (ZBUFFER_PTR zb, int width, int height) ;//仓ij建void Clear_Zbuffer (ZBUFFER_PTR zb, UINTdata) ;//清空和填充int Delete_Zbuffer (ZBUFFER_PTR zb) ;//删除在进行z-buffer测试时,建立了若干个互相交错的三角形面的几何模型,为了展 示z-buffer的工作情况,分别对每个三角形面采用不同的颜色对其进行着色,然后将所有 的三角形全部绘制到屏幕上,此前先记录下每个三角形空间中的位置,通过绘制可以观察 出是否是相对ζ值最小的三角形面被绘制在前面了。渲染效果图12,13。
权利要求
一种基于FlashVR的三维微型场景网络发布引擎,包括以下设计思路(1)根据Flash软件中对图形的表达方式,设计三维图形在Flash中的数学表达结构;(2)根据基础3D流水线、光照着色和纹理映射理论,确定三维场景视图生成的一般步骤;(3)基于ActionScript 3.0设计与实现引擎渲染模块。
2.根据权利要求1所述的一种基于FlashVR的三维微型场景网络发布引擎,其特征在 于,所述步骤(2)中,在渲染过程中采用z-buffer技术,针对屏幕上的每个像素点进行ζ排 序,进行去除隐藏面处理,防止渲染过程中面显示顺序异常情况的发生;所述步骤(3)中, 利用Flash脚本语言ActionScript 3. O实现一种免插件的三维微型场景网络发布引擎。
全文摘要
本发明涉及一种基于FlashVR的三维微型场景网络发布引擎,根据三维流水线,结合Flash软件中空间表达的方式,利用Flash脚本语言ActionScript 3.0实现了一种基于Flash的、免插件的三维微型场景网络发布引擎。实验表明,该引擎实现了对3dSmax或者maya等三维建模工具导出的三维模型文件的实时渲染和互动操作,最终生成相应的.swf文件,并将.swf文件嵌入到浏览器中,无需用户下载额外插件即可实现三维模型的发布;同时,在对部分通用技术细节进行整理和封装的基础上,形成一个面向FlashVR应用的应用程序接口函数,使得FlashVR开发人员不必再关心底层技术的实现细节,大大减少开发人员的工作难度和工作量,缩短开发周期。
文档编号G06F9/44GK101923462SQ20091005954
公开日2010年12月22日 申请日期2009年6月10日 优先权日2009年6月10日
发明者吕智涵, 王金萍, 陈戈, 韩勇, 齐永阳 申请人:成都如临其境创意科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1