Pv3D-9.排序.doc_第1頁
Pv3D-9.排序.doc_第2頁
Pv3D-9.排序.doc_第3頁
Pv3D-9.排序.doc_第4頁
Pv3D-9.排序.doc_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第九章 : Z-sorting (深度排列)簡(jiǎn)介: 本章主要介紹下面三個(gè)方面: a : 什么是Z-sorting(深度排序) b : layering scene renders (分層渲染場(chǎng)景) c : 用四叉樹進(jìn)行復(fù)雜的渲染的渲染 注:viewport層 就是ViewportLayer類的實(shí)例.它包含在viewport 內(nèi)Z-sorting的解釋 :在前面的章節(jié)中你一定碰到過Z-sorting(深度排序)的問題,你用的3D模型(model)越復(fù)雜,如果Z-sorting控制不準(zhǔn)確,導(dǎo)致的問題也將會(huì)越來越明顯 。下面兩幅圖顯示了兩個(gè)茶壺,它清楚的顯示了什么是Z-sorting(深度排序).上面的圖顯示有一部分平面不可見,噴口后面的平面由于排在茶壺身體所在面的后面(即就是排在后面,我們不可見的一面),因而不可見,這就是利用了Z-sorting 。The painters algorithm (排序算法)Z-sorting(深度排序)方法將決定每個(gè)平面在scene里的顯示深度,其深度位置是按照scene里的平面(即3D對(duì)象的某一面)距camera的距離來決定的 。在排序時(shí)判斷哪個(gè)平面應(yīng)該在前面是非常耗cpu的(The process of determining which triangle should be in front is CPU intensive.)。默認(rèn)的,papervision3d 用一種非??焖俚皇呛芫_的算法來為scene里的每個(gè)平面排序。該算法就是The painters algorithm ,它的主旨是:遠(yuǎn)處的物體應(yīng)在近處的物體之前被顯示出來(即先顯示遠(yuǎn)處的物體,再顯示近處的物體)該算法的流程如下 :第一:所有在camera視圖里的平面(3D對(duì)象的某一面)是按照距camera的距離,由遠(yuǎn)到近進(jìn)行排序的。第二:所有的平面(3D對(duì)象的某一面)是按照已排好的順序依次顯示在scene上 即:最先開始顯示最遠(yuǎn)處的的對(duì)象 然后由遠(yuǎn)及近依次顯示各個(gè)對(duì)象。最近的對(duì)象最后顯示。上面 最左邊的圖里的山是離camera最遠(yuǎn)的,所以它最先顯示出來,然后顯示中間那張圖里的草型區(qū)域,最后顯示右圖里的樹林。Sorting triangles 對(duì)平面進(jìn)行排序?yàn)榱烁玫睦斫夂蜕疃扰判蛴嘘P(guān)的問題,我們需要更好的理解深度排序,下面是一幅標(biāo)有注解的圖 。注:triangle :平面 。 按照The painters algorithm排序算法,則最先顯示的是最遠(yuǎn)處的平面對(duì)象。所以先顯示平面B,然后顯示平面A 。 下面的兩幅圖,左邊是按由近及遠(yuǎn)順序顯示的圖(圖Expected),右邊是按照深度排序的方法顯示的圖(圖painters algorithm) 有一個(gè)很有效的方法去解決上面顯示不明了的問題,即對(duì)B平面進(jìn)行再分 。下圖是對(duì)平面細(xì)分的指導(dǎo) :上面的平面B被再細(xì)分成平面B和平面C 。渲染scene時(shí),將會(huì)首先顯示平面C然后是平面A, 最后是平面B 。下圖是再分后的結(jié)果:如果換一個(gè)視角,將會(huì)導(dǎo)致重新排序,平面顯示的順序依舊是由遠(yuǎn)到近 ,只是此時(shí)各個(gè)平面距camera的距離發(fā)生了改變。如下圖:這時(shí),平面A將會(huì)最先顯示,然后是B 最后是C 。但是這里將會(huì)導(dǎo)致一個(gè)Z-sorting問題:即平面A將會(huì)和B重疊 。Layering your renders :為了增加3D對(duì)象的顯示效果,可以增加多個(gè)三角形平面(即創(chuàng)建更多的segment),但它不是最好的解決方案。因?yàn)楫?dāng)多個(gè)三角形平面的頂點(diǎn)(vertex)投影到scene上時(shí),三角形平面越多,投影到scene上的點(diǎn)也越多,因而消耗的cpu也越多 . 更好的解決辦法是用viewport(視口) 層,這些viewport(視口)層被嵌套在viewport里(因?yàn)関iewport可以多方位旋轉(zhuǎn),因而有多個(gè)viewport層)。 這些viewport(視口)層的概念與photoshop和flash里層的概念一樣,他們的工作原理一樣 ,最上層的總是顯示在最前面 。在photoshop里,每層只是放一種元素或者一種混合元素。在Pv3d里也是一樣,每層只放一種元素。例如:我們可以將椅子放在某一層,然后將桌子放在另一層。每層的排列順序可以通過pv3d 里算法實(shí)現(xiàn)。為了演示上述方法,我們將重用在第八章介紹過了的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.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; private 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(true,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.addMaterial(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 AnimationClip3D (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 - stage.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對(duì)象添加了由WireframeMaterial和ColorMaterial組成的混合材質(zhì)(floorMat)。最后onRenderTick(e:Event=null)方法里的幾段代碼是創(chuàng)建鼠標(biāo)的交互性。移動(dòng)鼠標(biāo),Camera將會(huì)繞scene原點(diǎn)進(jìn)行旋轉(zhuǎn) ,因而我們就能看到多個(gè)方位 。測(cè)試代碼,將會(huì)是下面這樣的畫面 ,下面的地板floor有一些Z-sorting(深度排序)問題。因?yàn)閺牡撞靠?,模型mill在floor的后面,我們看不到mill模型 。為了能讓我們?cè)趂loor后面看到mill模型,下面我們用層的概念分析一下該問題 :為了解決該問題,我們?cè)诖颂岢錾厦嬷v述了很多的層問題。 用層的方法可以解決mill模型不可見的問題 。 因?yàn)閺牡撞靠?,模型mill在floor的后面,即floor在最上層,而mill模型在floor的下一層,因而我們看不到mill模型。 為了使mill模型在從底部看可見,我們只需改變floor和mill模型 層的順序的即可 。下面有一些改變層順序的方法:用useOwnContainer屬性創(chuàng)建一個(gè)viewport層設(shè)置3D對(duì)象的useOwnContainer為true(3dDisplayObject. useOwnContainer=true;),將會(huì)創(chuàng)建一個(gè)新的層,該層在所有層的上面(即該層在最上面)。并且該3d對(duì)象被畫在了該層上。因而該3d對(duì)象將不會(huì)被遮住。在上面的代碼中為了使我們從底部看mill模型可見,只需在modelLoaded()方法里加上下面一句代碼:mill.useOwnContainer = true;加上上句代碼后再次測(cè)試,發(fā)現(xiàn)現(xiàn)在的效果更好,圖片如下:換多個(gè)方位看,我們會(huì)發(fā)現(xiàn)不存在Z-sorting問題了。其圖片顯示如下:右圖是從較低的點(diǎn)的視口看的(即看它的底部)。把useOwnContainer設(shè)為true后,mill模型始終在最上層,因而我們始終能看到mill模型。但這是不符合真實(shí)的,并且該屬性很耗cpu。下面我們將介紹另外兩種方法來代替useOwnContainer方法。下面的兩種方法更符合現(xiàn)實(shí)。用getChildLayer方法創(chuàng)建viewport層并給viewport層排序通過viewport3D類的getChildLayer方法得到ViewportLayer的實(shí)例。var millLayer:ViewportLayer = viewport.getChildLayer(mill);為了使它運(yùn)行,我們還需要導(dǎo)入ViewportLayer類:import org.papervision3d.view.layer.ViewportLayer;getChildLayer()的三個(gè)參數(shù): 參數(shù)數(shù)據(jù)類型 默認(rèn)值 用法描述do3d DisplayObject3D 獲得的do3d的所在層或者為do3d創(chuàng)建一個(gè)新的層(創(chuàng)建新的層需要第二個(gè)參數(shù))createNew Boolean true是否為do3d創(chuàng)建一個(gè)新的viewport層(該值一般設(shè)為true,這樣才能創(chuàng)建一個(gè)新的層,因?yàn)樾聦釉谒袑拥淖钌厦妫㏑ecurse Boolean true 是否將do3d里的子對(duì)象也 添加到該層當(dāng)你得到新的viewport層的實(shí)例,你也可以將其他的3D對(duì)象添加到同一個(gè)層中。例如我們可以將大量mill模型添加到同一層. 作為用法演示: 我們?cè)谙惹暗拇a的基礎(chǔ)上 ,將floor添加到millLayer 層里 。當(dāng)然這是沒有意義的,這和不用層得到的效果是一樣的。因?yàn)樘砑觙loor以后,floor就又在最上面了。我們?cè)谶@里只是介紹用法:millLayer.addDisplayObject3D(floor);實(shí)例化ViewportLayer來創(chuàng)建 viewport 層下面是用法 :var millLayer:ViewportLayer = new ViewportLayer(viewport,null);viewport.containerSprite.addLayer(millLayer);millLayer.addDisplayObject3D(mill,true);ViewportLayer類的構(gòu)造函數(shù)的三個(gè)參數(shù) : 參數(shù)數(shù)據(jù)類型默認(rèn)值用法描述Viewport Viewport3DViewport3D實(shí)例對(duì)象do3d DisplayObject3D 被添加進(jìn)層的3d對(duì)象在getChildLayer() 方法里可以設(shè)置Recurse為true,將3d對(duì)象的子對(duì)象全部添加到層中。但是在ViewportLayer構(gòu)造函數(shù)中并沒有Recurse這個(gè)參數(shù),因此在上面的代碼中將do3d屬性設(shè)為null,然后用addDisplayObject3D() 方法將do3d對(duì)象添加到層,addDisplayObject3D()方法的第二參數(shù)為Recurse ,故可以在這里進(jìn)行設(shè)置isDynamicBooleanfalse是否要去除層在接下來的渲染。這個(gè)參數(shù)時(shí)pv3d內(nèi)部決定的,不能在外部修改,只能在源碼處進(jìn)行修改addDisplayObject3D()的一個(gè)參數(shù)為do3d 第二個(gè)為Recurse 。Sorting layers前面的例子展示了使用viewport 層來解決Z-sorting(深度排序)問題,但是增加多個(gè)層也會(huì)帶來處理層的問題。Papervision3D有三個(gè)內(nèi)置的模式(mode)去處理這個(gè)問題 。用到的是sortMode屬性 。用法如下:viewport.containerSprite.sortMode = ViewportLayerSortMode.Z_SORT;Papervision3D支持viewport層的3種排序算法 是ViewportLayerSortMode類三個(gè)靜態(tài)常量屬性ViewportLayerSortMode.Z_SORTViewportLayerSortMode.ORIGIN_SORTViewportLayerSortMode.INDEX_SORT在使用上面的3個(gè)mode時(shí), 必須導(dǎo)入類:import org.papervision3d.view.layer.util.ViewportLayerSortMode;用ViewportLayerSortMode.Z_SORT給viewport 層排序 :默認(rèn)的,這些viewport 層是按照Z-sorting深度排序的算法進(jìn)行排序的.他們排序的方式是基于層上的每個(gè)點(diǎn)(vertices)的Z坐標(biāo)距camera的平均值來決定(即層內(nèi)所有的點(diǎn)在Z軸上距camera的距離/點(diǎn)的總數(shù))。因而距camera最遠(yuǎn)的層將會(huì)最先顯示在scene在舞臺(tái)上,然后是較遠(yuǎn)的顯示。目前,我們只為mill模型創(chuàng)建了一個(gè)層,但我們要用層給mill模型和floor進(jìn)行排序時(shí)。我們需要將floor也添加到viewport層中(一個(gè)新的viewport層)var millLayer:ViewportLayer = viewport.getChildLayer(mill);var floorLayer:ViewportLayer = viewport.getChildLayer(floor);上面的代碼創(chuàng)建了兩個(gè)新層。當(dāng)你測(cè)試,從頂部和從底部看你的3D模型和floor會(huì)發(fā)現(xiàn)不存在Z-sorting(深度排序)問題。但是,把camera 放在floor的上面一點(diǎn)點(diǎn),會(huì)發(fā)現(xiàn)又出現(xiàn)了Z-sorting(深度排序問題),這時(shí)會(huì)發(fā)現(xiàn)整個(gè)floor對(duì)象顯示在mill模型前面而不是單一的一個(gè)平面。為此,我們可以強(qiáng)制為某個(gè)viewport 層設(shè)置深度(即距camera的距離),如果設(shè)置floor距camera的距離為2000,因而達(dá)到為floor排序的目的 。下面是用法:floorLayer.forceDepth = true;floorLayer.screenDepth = 2000; 用上述方法可以達(dá)到為viewport重新排序的目的 (即強(qiáng)制設(shè)置他們的深度)。用 ViewportLayerSortMode.ORIGIN_SORT給層排序第二種算法是基于每個(gè)三D對(duì)象的原點(diǎn)進(jìn)行的:當(dāng)用默認(rèn)的z-sorting(即:ViewportLayerSortMode.Z_SORT)排序無法滿足精確的要求時(shí)。例如有一個(gè)模型,在某一面上有多個(gè)點(diǎn)(vertices),而在其他面上的點(diǎn)卻很少。當(dāng)按上述方法對(duì)它的深度(即距camera的距離)取平均值顯然是不精確的 ,這將會(huì)導(dǎo)致失去平衡。為了解決這種情況,我們使用ViewportLayerSortMode.ORIGIN_SORT 排序,它是按照3D對(duì)象的原點(diǎn)進(jìn)行排序的。當(dāng)一個(gè)層中包含很多3D對(duì)象時(shí),他們的原點(diǎn)將會(huì)取平均值 。用ViewportLayerSortMode.INDEX_SORT給viewport 層(ViewportLayer)排序這種算法是基于層的layerIndex屬性來實(shí)現(xiàn)的。我們可以控制設(shè)定它:var millLayer:ViewportLayer = viewport.getChildLayer(mill);var floorLayer:ViewportLayer = viewport.getChildLayer(floor);millLayer.layerIndex = 1;floorLayer.layerIndex = 2;viewport.containerSprite.sortMode = ViewportLayerSortMode.INDEX_SORT;我們這樣設(shè)置millLayer.layerIndex = 1; floorLayer.layerIndex = 2; ,將會(huì)導(dǎo)致scene里先創(chuàng)建millLayer(即離camera較遠(yuǎn)) 然后再創(chuàng)建floorLayer層(即離camera較近),由于floorLayer層較后創(chuàng)建,因而floorLayer層在的最上面。盡管這樣做對(duì)floorLayer層意義不大,但是我們是借此來介紹怎樣使用layerIndex 屬性 。目前我們已經(jīng)有了幾種可供選擇的方法來給viewport層(ViewportLayer)進(jìn)行排序。但是這些方法在我們的demo(即演示例子)里的使用都不能達(dá)到正確的效果。一個(gè)可供選擇的方法是將它設(shè)為只有一面可見 即:matrial.oneSide=true; 但是對(duì)于這個(gè)demo,這并不是我們想要的。當(dāng)cameral在floor的上表面和下表面時(shí),我們需要正確(即符合實(shí)際)的觀察floor和mill模型如果我們用ViewportLayerSortMode.INDEX_SORT給層排序,當(dāng)cameral在floor的上表面和者下表面之間進(jìn)行變動(dòng)時(shí),使用layerIndex屬性來交換viewport層(ViewportLayer)的深度 將會(huì)產(chǎn)生怎么的結(jié)果呢?在 onRenderTick()方法里來設(shè)定這些屬性/注意:下面的代碼是demo的代碼的基礎(chǔ)上進(jìn)行的/下面的代碼是放在onRenderTick()里面的if(camera.y-410) viewport.getChildLayer(mill).layerIndex = 1; viewport.getChildLayer(floor).layerIndex = 2;else viewport.getChildLayer(mill).layerIndex = 2; viewport.getChildLayer(floor).layerIndex = 1;為了使layerIndex屬性正常運(yùn)行我們還需要這樣設(shè)置:viewport.containerSprite.sortMode = ViewportLayerSortMode.INDEX_SORT;這行代碼放在modelLoaded()方法里上述方法成功解決了demo里存在的問題但這個(gè)方法并不是在每個(gè)工程中都適用 。Creating and sorting sublayers不僅viewport支持viewport層(ViewportLayer),viewport 層他們自己也可以嵌套層(即層中再包含層),因而我們可以在同一個(gè)scene里使用多種排序方法。下面我們按照?qǐng)D示寫出相關(guān)代碼:/Create viewport layer 1 structurevar viewportLayer1:ViewportLayer = new ViewportLayer(viewport,null);var viewportLayer1_1:ViewportLayer = new ViewportLayer(viewport, chair);var viewportLayer1_2:ViewportLayer = new ViewportLayer(viewport, table);viewportLayer1.addLayer(viewportLayer1_1);viewportLayer1.addLayer(viewportLayer1_2);viewportLayer1.sortMode = ViewportLayerSortMode.INDEX_SORT;/Create a regular viewport layer 2var viewportLayer2:ViewportLayer = new ViewportLayer(viewport,floor);/Create viewport layer 3 structurevar viewportLayer3:ViewportLayer = new ViewportLayer(viewport,null);var viewportLayer3_1:ViewportLayer = new ViewportLayer(viewport,wall);var viewportLayer3_2:ViewportLayer = new ViewportLayer(viewport,door);viewportLayer3.addLayer(viewportLayer3_1);viewportLayer3.addLayer(viewportLayer3_2);viewportLayer3.sortMode = ViewportLayerSortMode.ORIGIN_SORT; /Add parent layers to the viewportviewport.containerSprite.addLayer(viewportLayer1);viewport.containerSprite.addLayer(viewportLayer2);viewport.containerSprite.addLayer(viewportLayer3);viewport.containerSprite.sortMode = ViewportLayerSortMode.Z_SORT;從上面的代碼中可以看出嵌套的層在處理深度排序時(shí) 和在viewport里一樣 。四叉樹渲染引擎(Quadtree rendering)四叉樹渲染引擎(Quadtree rendering)可以代替我們現(xiàn)在默認(rèn)使用的的BasicRenderEngine 引擎。我們對(duì)四叉樹渲染引擎(Quadtree rendering)的算法不會(huì)深入講解。 我們只需要知道它可以解決大部分的深度排序(Z-sorting)問題。但是四叉樹渲染引擎(Quadtree rendering)非常耗CPU。盡管這樣,由于它的使用非常簡(jiǎn)單,下面我們來使用它:首先我們要新建一個(gè)工程,該工程是在ViewportLayersExample文檔類(本章前面的模板,第一個(gè)代碼) 的基礎(chǔ)上建立起來。在該類的基礎(chǔ)上,我們需要導(dǎo)入四叉樹渲染引擎(Quadtree rendering)的包,import org.papervision3d.render.QuadrantRenderEngine;然后在init()方法里加上下面的代碼:renderer = new QuadrantRenderEngine();上面的代碼代替了我們默認(rèn)的BasicRenderEngine引擎。BasicRenderEngine引擎是在我們繼承BasicView類時(shí)自動(dòng)創(chuàng)建的。實(shí)例化QuadrantRenderEngine只需要一個(gè)參數(shù) 該參數(shù)指定你要選擇哪種排序的方法。這些方法是QuadrantRenderEngine類的靜態(tài)常量。QuadrantRenderEngine.CORRECT_Z_FILTER: :為不交叉的平面進(jìn)行正確的排序。QuadrantRenderEngine.QUAD_SPLIT_FILTER: 為交叉的平面進(jìn)行排序,引擎將會(huì)自動(dòng)的分割交叉的平面,然后進(jìn)行正確的排序。QuadrantRenderEngine.ALL_FILTERS:這個(gè)是上面兩種類型的組合。它是默認(rèn)值(即不傳參數(shù)時(shí)默認(rèn)是它)當(dāng)我們測(cè)試代碼,會(huì)發(fā)現(xiàn)出現(xiàn)的情況不令人滿意。原因是我們用的模型是由少量的平面組成,這就限制了四叉樹渲染引擎(Quadtree rendering)的正常發(fā)揮。該問題得原因是因?yàn)槊恳粋€(gè)平面都被四叉樹渲染引擎(Quadtree rendering)渲染了,但是并不是每個(gè)平面都需要用四叉樹渲染引擎(Quadtree rendering)進(jìn)行渲染,我們可以不讓3D對(duì)象不被四叉樹渲染引擎(Quadtree rendering)進(jìn)行渲染,因而該3D對(duì)象將會(huì)被默認(rèn)的BasicRenderEngine引擎進(jìn)行渲染。 我們可以用設(shè)置3D對(duì)象的testQuad屬性為false來實(shí)現(xiàn)。我們例子的問題在于floor的深度排序問題。因而我們可以用四叉樹渲染引擎(Qua

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論