`
wsliujian
  • 浏览: 92651 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

PV3D 破面

阅读更多
PV3D是一个开源的遵循MIT协议的使用AS3代码写成的3D引擎.
在PV3D中,当两个物体接触时,他们的面就回进行错误排列,产生破面现象,为什么会出现这种情况。
  三维物体的面的最小单位是三角形,三角形离摄像机的垂直距离,我们一般称作Z-depth,我一般称作Z-depth(深度),所以当两个最小单位碰面的时候,就只能出现一个在另个物体的上面,而不能都出现一部分。怎样解决?
1.第一个办法是使用viewportLayer做整体排列来调整这个模型的深度,让一个物体在另一个物体的上面,而不是事一个物体的一部分在另一个物体的上面,当然这样的代价,就是一个物体会突然蹦到另一个物体的外面。但是效率高,不需要用四叉树渲染,在没有3D加速卡渲染的情况下,是一个很好选择,因为flash作为一个客户端程序没有办法去调用DirectX中的API,所有没办法去使用显卡去渲染,而只能使用cpu去渲染。我们通常看到在使用PV3D在运行在浏览器时,CPU的使用率都很高,就是这个原因。
2.使用更多的面
这样破面的几率更小,同时出现破面后的,影响也越小,因为面越多,出现破面后的影响的区域越小,当然这样会影响一定效率,CPU要花更多时间来渲染这些面。
3.四叉树渲染

什么交四叉树渲染,
四叉树用于点数据、区域、曲线、平面及立体方面。在每一层上可以分解成相等的部分。

区域四叉树是基于把图像数组不断细分到四个相同大小的象限中。如果这个数组不是完全由1或完全由0组成(也就是说这个区域没有覆盖整个数组),那么它将被细分到象限中、子象限中,依此类推,直到得到完全由1或完全由0组成的块为止 。
作为区域四叉树的一个例子,从图1.可以看出,区域内的像素用1表示,区域外的像素用0表示。由图1中数组所产生的块由图1.1c表示,这个过程由度数为4的树表示(即每一个非叶子结点有4个孩子结点)。
在树型表示中,根结点与整个数组相对应。一个结点的每一个子结点表示一个由这个结点所表示区域的一个象限(按西北、东北、西南、东南次序标记)。叶结点则与那些没有必要进一步细分的块相对应。 标记为黑的或白的,主要依据它的相应块是否完全在表示的区域内(仅包含1)或外(不含1)。所有的非叶子结点均被标记为灰色(也就是说,它的块同时包含0和1)。
简单的说就是将破门的三角形,通过算法拆成更新的三角形,在PV3D中已经加入了QuadTree算法,很好的解决了这个问题
private function clickHandler(e:MouseEvent):void   
        {  
            if(renderer is QuadrantRenderEngine)  
                renderer = new BasicRenderEngine();  
            else 
                renderer = new QuadrantRenderEngine(QuadrantRenderEngine.ALL_FILTERS);  
        }  
但是当面很多的时候,效率确实不敢恭维。

我的网站设计 web design home page
http://www.webdesign-cn.com
http://www.webdesign-china.cn
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics