Pv3D-9.排序

上传人:桔**** 文档编号:507742737 上传时间:2023-04-21 格式:DOC 页数:10 大小:60.50KB
返回 下载 相关 举报
Pv3D-9.排序_第1页
第1页 / 共10页
Pv3D-9.排序_第2页
第2页 / 共10页
Pv3D-9.排序_第3页
第3页 / 共10页
Pv3D-9.排序_第4页
第4页 / 共10页
Pv3D-9.排序_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《Pv3D-9.排序》由会员分享,可在线阅读,更多相关《Pv3D-9.排序(10页珍藏版)》请在金锄头文库上搜索。

1、精品文档,仅供学习与交流,如有侵权请联系网站删除第九章 : Z-sorting (深度排列)简介: 本章主要介绍下面三个方面: a : 什么是Z-sorting(深度排序) b : layering scene renders (分层渲染场景) c : 用四叉树进行复杂的渲染的渲染 注:viewport层 就是ViewportLayer类的实例.它包含在viewport 内Z-sorting的解释 :在前面的章节中你一定碰到过Z-sorting(深度排序)的问题,你用的3D模型(model)越复杂,如果Z-sorting控制不准确,导致的问题也将会越来越明显 。下面两幅图显示了两个茶壶,它清楚

2、的显示了什么是Z-sorting(深度排序).上面的图显示有一部分平面不可见,喷口后面的平面由于排在茶壶身体所在面的后面(即就是排在后面,我们不可见的一面),因而不可见,这就是利用了Z-sorting 。The painters algorithm (排序算法)Z-sorting(深度排序)方法将决定每个平面在scene里的显示深度,其深度位置是按照scene里的平面(即3D对象的某一面)距camera的距离来决定的 。在排序时判断哪个平面应该在前面是非常耗cpu的(The process of determining which triangle should be in front is

3、CPU intensive.)。默认的,papervision3d 用一种非常快速但不是很精确的算法来为scene里的每个平面排序。该算法就是The painters algorithm ,它的主旨是:远处的物体应在近处的物体之前被显示出来(即先显示远处的物体,再显示近处的物体)该算法的流程如下 :第一:所有在camera视图里的平面(3D对象的某一面)是按照距camera的距离,由远到近进行排序的。第二:所有的平面(3D对象的某一面)是按照已排好的顺序依次显示在scene上 即:最先开始显示最远处的的对象 然后由远及近依次显示各个对象。最近的对象最后显示。上面 最左边的图里的山是离camer

4、a最远的,所以它最先显示出来,然后显示中间那张图里的草型区域,最后显示右图里的树林。Sorting triangles 对平面进行排序为了更好的理解和深度排序有关的问题,我们需要更好的理解深度排序,下面是一幅标有注解的图 。注:triangle :平面 。按照The painters algorithm排序算法,则最先显示的是最远处的平面对象。所以先显示平面B,然后显示平面A 。 下面的两幅图,左边是按由近及远顺序显示的图(图Expected),右边是按照深度排序的方法显示的图(图painters algorithm) 有一个很有效的方法去解决上面显示不明了的问题,即对B平面进行再分 。下图是

5、对平面细分的指导 :上面的平面B被再细分成平面B和平面C 。渲染scene时,将会首先显示平面C然后是平面A, 最后是平面B 。下图是再分后的结果:如果换一个视角,将会导致重新排序,平面显示的顺序依旧是由远到近 ,只是此时各个平面距camera的距离发生了改变。如下图:这时,平面A将会最先显示,然后是B 最后是C 。但是这里将会导致一个Z-sorting问题:即平面A将会和B重叠 。Layering your renders :为了增加3D对象的显示效果,可以增加多个三角形平面(即创建更多的segment),但它不是最好的解决方案。因为当多个三角形平面的顶点(vertex)投影到scene上时

6、,三角形平面越多,投影到scene上的点也越多,因而消耗的cpu也越多 . 更好的解决办法是用viewport(视口) 层,这些viewport(视口)层被嵌套在viewport里(因为viewport可以多方位旋转,因而有多个viewport层)。 这些viewport(视口)层的概念与photoshop和flash里层的概念一样,他们的工作原理一样 ,最上层的总是显示在最前面 。在photoshop里,每层只是放一种元素或者一种混合元素。在Pv3d里也是一样,每层只放一种元素。例如:我们可以将椅子放在某一层,然后将桌子放在另一层。每层的排列顺序可以通过pv3d 里算法实现。为了演示上述方法

7、,我们将重用在第八章介绍过了的animatedMill模型。下面将展示一些Z-sorting(深度排序)的问题 。下面的代码将作为本章的模板。 package import flash.events.Event; import org.papervision3d.core.animation.clip.AnimationClip3D; import org.papervision3d.events.FileLoadEvent; import org.papervision3d.materials.ColorMaterial; import org.papervision3d.materials

8、.WireframeMaterial; import org.papervision3d.materials.special.CompositeMaterial; import org.papervision3d.objects.parsers.DAE; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.view.BasicView; private class ViewportLayersExample extends BasicView private var mill:DAE; priv

9、ate var floor:Plane; private var rotX:Number = 0.1; private var rotY:Number = 0.1; private var camPitch:Number = 90; private var camYaw:Number = 270; private var easeOut:Number = 0.1; public function ViewportLayersExample() stage.frameRate = 40; init(); private function init():void mill = new DAE(tr

10、ue,null,true); mill.addEventListener(FileLoadEvent.LOAD_COMPLETE, modelLoaded);mill.load(assets/animatedMill.dae); var colorMat:ColorMaterial = new ColorMaterial(0x006600); var wireMat:WireframeMaterial = new WireframeMaterial(); var floorMat:CompositeMaterial = new CompositeMaterial(); floorMat.add

11、Material(colorMat); floorMat.addMaterial(wireMat); floorMat.doubleSided = true; floor = new Plane(floorMat,1000,1000,1,1); floor.y = -410; scene.addChild(floor); floor.rotationX = 90; private function modelLoaded(e:FileLoadEvent):void scene.addChild(mill); var animationLeft:AnimationClip3D = new Ani

12、mationClip3D (right,0,6); var animationRight:AnimationClip3D = new AnimationClip3D (left,6,12); mill.animation.addClip(animationRight); mill.animation.addClip(animationLeft); mill.play(right); startRendering(); override protected function onRenderTick(e:Event=null):void var xDist:Number = mouseX - s

13、tage.stageWidth * 0.5; var yDist:Number = mouseY - stage.stageHeight * 0.5; camPitch += (yDist * rotX) - camPitch + 90) * easeOut; camYaw += (xDist * rotY) - camYaw + 270) * easeOut; camera.orbit(camPitch, camYaw); super.onRenderTick(); 在init()方法里,我们加载了外部模型,并把它添加到了scene里。为地板floor对象添加了由WireframeMater

14、ial和ColorMaterial组成的混合材质(floorMat)。最后onRenderTick(e:Event=null)方法里的几段代码是创建鼠标的交互性。移动鼠标,Camera将会绕scene原点进行旋转 ,因而我们就能看到多个方位 。测试代码,将会是下面这样的画面 ,下面的地板floor有一些Z-sorting(深度排序)问题。因为从底部看,模型mill在floor的后面,我们看不到mill模型 。为了能让我们在floor后面看到mill模型,下面我们用层的概念分析一下该问题 :为了解决该问题,我们在此提出上面讲述了很多的层问题。 用层的方法可以解决mill模型不可见的问题 。 因为

15、从底部看,模型mill在floor的后面,即floor在最上层,而mill模型在floor的下一层,因而我们看不到mill模型。 为了使mill模型在从底部看可见,我们只需改变floor和mill模型 层的顺序的即可 。下面有一些改变层顺序的方法:用useOwnContainer属性创建一个viewport层设置3D对象的useOwnContainer为true(3dDisplayObject. useOwnContainer=true;),将会创建一个新的层,该层在所有层的上面(即该层在最上面)。并且该3d对象被画在了该层上。因而该3d对象将不会被遮住。在上面的代码中为了使我们从底部看mill模型可见,只需在modelLoaded()方法里加上下面一句代码:mill.useOwnContainer = true;加上上句代码后再次测试,发现现在的效果更好,图片如下:换多个方位看,我们会发现不存在Z-sorting问题了。其图片显示如下:右图是从较低的点的视口看的(即看它的底部)。把useOwnContainer设为true后,mill模型始终在最上层,因而我们始终能看到mill模型。但这是不符合真实的,并且该属性很耗cpu。下面我们将介绍另外两种方法来代

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 试题/考题 > 初中试题/考题

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号