flash 3d flash3d 研究所 pv3d 共享资源  | 经典范例  | 视频教程  | 友情链接  | 联系我们
登陆 | 注册  flash 3d 研究所
讨论区





最近更新:
● payday loan阁下在教程区里 回复“《pv3d, sandy, away3d...”(05:56:23)
● bad credit payday loan阁下在教程区里 回复“《超简易papervision3D基础 ...”(05:56:13)
● payday loan阁下在教程区里 回复“《超简易papervision3D基础 ...”(05:56:12)
浏览主题:解决破面的一个方法

解决破面的一个方法
noxss (2009-09-24 18:35:32)

破面大家都知道了吧,两个平面靠的很近的情况下就有可能出现破面哦。
除了美工的方法,这里给出个解决方案(应该还没人发过吧?):给场景中的物体分层,并根据物体的旋转动态地改变图层顺序。
请看例子:
这里给出一个比较极端的例子:两个平面重叠(你可以理解为“靠的很近”的极端情况),一个蓝色,一个绿色,材质都是双面的(这里是为了看出更清楚地看出破面的效果),两个平面同时旋转。想要的效果是旋转中两平面交替出现,并且不出现破面。如果不采取任何措施的话是不行的,因为靠的太近,会出现破面。代码如下:

package
{
     import flash.events.Event;
     import org.papervision3d.objects.primitives.*;
     import org.papervision3d.view.*
     import org.papervision3d.materials.*;
     public class example_01 extends BasicView
     {
           private var Green   :ColorMaterial;
           private var Blue   :ColorMaterial;
           private var GrePlane :Plane;
           private var BluPlane :Plane;
           public function example_01()
           {
                 super(0, 0, true);
                 
                 Green = new ColorMaterial(0x95D500);
                 Blue = new ColorMaterial(0x0D7DC8);
                 Green.doubleSided = true;
                 Blue.doubleSided = true;
                 
                 GrePlane = new Plane(Green, 500, 500, 20, 20);
                 BluPlane = new Plane(Blue , 500, 500, 20, 20);
                 
                 scene.addChild(GrePlane);
                 scene.addChild(BluPlane);
                 
                 startRendering();
           }
           override protected function onRenderTick(event:Event = null):void
           {
                 GrePlane.pitch(2.5);
                 BluPlane.pitch(2.5);
                 
                 super.onRenderTick();
           }
     }
}

试着编译看看,会出现很多破面吧。。那么再看看修改过的代码吧:

package
{
     import flash.events.Event;
     import org.papervision3d.view.layer.*;
     import org.papervision3d.objects.primitives.*;
     import org.papervision3d.view.*
     import org.papervision3d.materials.*;
     public class example_01 extends BasicView
     {
           private var Green   :ColorMaterial;
           private var Blue   :ColorMaterial;
           private var GrePlane :Plane;
           private var BluPlane :Plane;
           private var GrePlaneLay :ViewportLayer;
           private var BluPlaneLay :ViewportLayer;
           public function example_01()
           {
                 super(0, 0, true);
                 viewport.containerSprite.sortMode = 'index';
                 
                 Green = new ColorMaterial(0x95D500);
                 Blue = new ColorMaterial(0x0D7DC8);
                 Green.doubleSided = true;
                 Blue.doubleSided = true;
                 
                 GrePlane = new Plane(Green, 500, 500, 20, 20);
                 BluPlane = new Plane(Blue , 500, 500, 20, 20);
                 
                 GrePlaneLay = viewport.getChildLayer(GrePlane);
                 BluPlaneLay = viewport.getChildLayer(BluPlane);
                 GrePlaneLay.layerIndex = 3;
                 BluPlaneLay.layerIndex = 2;
                 
                 scene.addChild(GrePlane);
                 scene.addChild(BluPlane);
                 
                 startRendering();
           }
           private function setLayIndexByRotation():void
           {
                 if (GrePlane.rotationX < 90 && GrePlane.rotationX > -90)
                 {
                       GrePlaneLay.layerIndex = 1;
                 }else{
                       GrePlaneLay.layerIndex = 3;
                 }
           }
           override protected function onRenderTick(event:Event = null):void
           {
                 GrePlane.pitch(2.5);
                 BluPlane.pitch(2.5);
                 setLayIndexByRotation();
                 
                 super.onRenderTick();
           }
     }
}

再编译一次看看,是不是解决了?^_^

这里贴出的是以前做的一个小演示,这个应用可以有很多扩展,也许有时间我会把他做成一个类来。。。


flash 3d 研究所 DDM君
(2009-09-25 07:36:05)
虽然只是针对简单的情况,但是思路非常的不错,很棒的哦,noxss君!

flash 3d 研究所 幻想家
(2009-09-29 00:33:28)
真是不错的方法,谢谢noxxs君!

flash 3d 研究所 DDM君
(2009-09-29 08:44:45)
noxss君的研究都是非常不错的哟^_^

评论人:
邮   箱: (填入邮箱,博客地址均可)

内   容: (广告和垃圾内容可能会被删除,望理解)
链接地址

验证码:(为防止机器人骚扰,请麻烦输入验证码^_^)
  

(目前需登陆方可发表)


不想添加了