1. 采用技术
a) 因为是B/S结构,所以主要采取时下流行的FLASH实现,编程语言为AS,全称Action Script
b) 而现时对于FLASH编程也就是AS对接语言中,最为友好的是ASP.NET,因此数据部分采用ASP.NET
2. 技术细节
a) 众所周知,flash是一个二维的动画软件,是无法完成一些真正的3d效果,但是如果要用它来做一些3d效果也不是不可能,一般来说有以下三种方法.
b) 第一种方法,借助其它的3d软件,象swift 3d,Ulead Cool 3d,TrueSpace等一些相对容易上手的软件,用它们来完成后再导入到flash中,效果是不错,但是导入的大都是位图系列,所以生成的文件都比较大,再有一个特点就是没有flash所特有的互动性,作为flash 并没有多少工作可做,它只不过是播放的工具而已.
c) 第二种方法,理论上可以,实际上是行不通的,就是利用flash 的画图工具做成逐帧动画,当然简单的还凑合,复杂的就根本不行.
d) 第三种方法,就是我今天所要说的as 3d ,用数学方法算出3d来,也就是利用数学公式和一些透视的知识模仿出3d效果来,也称之为假3d,是一种视觉上的错觉.在电视上出现的3d应该都假3d,只不过那些专业的3d软件做出来的更逼真,更能欺骗你的眼睛罢了.
e) 言归正传,我们首先认识一下坐标问题,因为要模仿三维效果,必须首先了解坐标方面的知识,,因为3d效果都是三维坐标,而flash中是二维坐标,我们应该先把三维坐标转换二维数学坐标,再把二维坐标转换为flash中的坐标
3. 虚拟实景
a) 点透视与投影
i. 通过1点透视来产生远小近大的变化以产生空间感,设想观察者camera在一个正六面体中央,通过一点透视来计算每个面的在空间投影中的位置,以产生透视效果.
ii.
b) 细分贴图
i. flash的matrix类只支持2D图形变换:切变、缩放、平面位移。位图无法实现3D变换,这与openGL不同,openGL只需要在定义多边型顶点和贴图法线,位图就会自动贴到一个面片上,而且整个贴图过程完全由GPU完成。而在flash中必须使用细分贴图的方法来欺骗人们的眼睛,既:将一张图片细分为n张小的三角面片,再将小三角面片进行平面切变,正因为如此,flash3D一旦涉及贴图必然导致大量占用cpu运算资源.
ii.
c) 作为平面矢量图形界面环境,flash显然不具备直接部署3D应用的能力,所有关于3D的函数都需要用actionscript一行一行写出来,包括camera,视体裁减和贴图算法等,Flash3D引擎的核心在于3部分:
i. 贴图算法,flash现有as语言没有关于位图透视拉伸的函数,所以需要自己编写算法。我所采用的是细分表面的方法解决了Flash中位图的透视拉伸问题。
ii. 3D环境,简单的说,我采用了传统的空间向量法来计算每一个顶点的位置,虽然这样会有大量多余的数据,但把向量计算封装在矩阵里以后,代码会变得很直观清晰。构件一个完整的3D环境就需要把所有矩阵计算封装到一个个函数里面。而大概全部的矩阵计算公式有不下20种。这还不包括一些碰撞检测。
iii. 视体裁减 视觉体的裁减算法可以极大提高效率,超过屏幕和法线与视线夹角超过180度的平面可以省略。
d) 消隐算法
i. 如果没有消隐算法,那么观察者只能看到离屏幕最近的面,而不能看到整个3D空间,理论上消隐算法有3个步骤:1在一个六面体中,面法线与视锥体夹角大于180度则应设为不可见,2在同一个像素上,只显示与camera最近的多边形,3投影在屏幕以外的多边型不可见,但这三种算法非常占用cpu资源,因此设计了一种更简单的算法:1多边形的中心与camera重合,在camera坐标系中Z值<0的多边形不可见,2投影在屏幕以外的多边型不可见。