天天看點

PV3D手記

這篇我們來看一下BasicView這個類,它可以讓我們非常友善的創造出一個包含前面所說的那四個基本元素的3D世界。你隻需要執行個體化它并加入到顯示清單中即可,但我們更常用的是通過繼承它來直接使用這個3D世界,現在先看一下它的文檔。

 

BasicView

Package org.papervision3d.view

Class public class BasicView

Inheritance BasicView AbstractView flash.display.Sprite

Implements IView

Subclasses ReflectionView

  

  BasicView provides a simple template for quickly setting up basic Papervision3D projects by creating a viewport, scene, camera, and renderer for you. Because BasicView is a subclass of Sprite, it can be added to any DisplayObject.

  BasicView為我們提供了一個包含viewport, scene, camera, 和renderer,可以 快速建立PV3D項目的模版,而且它是Sprite的子類,可以直接添加到任何DO裡面。

 

構造方法

BasicView(viewportWidth:Number = 640, viewportHeight:Number = 480, scaleToStage:Boolean = true, interactive:Boolean = false, cameraType:String = “Target”)

參數應該能了解吧,不了解的看看前面那篇筆記。

然後看幾個它繼承自AbstractView的比較有用的屬性和方法

camera : CameraObject3D

renderer : BasicRenderEngine

scene : Scene3D

viewport : Viewport3D

viewportHeight : Number

viewportWidth : Number

這些屬性不清楚的看下前面的筆記

 

方法:

singleRender():void

渲染一次

startRendering():void

開始每幀渲染

stopRendering(reRender:Boolean = false, cacheAsBitmap:Boolean = false):void

結束每幀渲染

 

了解了這些屬性和方法,我們來看一段代碼,這段代碼實作了和前面教程完全一樣的效果。

 

 

?[Copy to clipboard]View Code ACTIONSCRIPT3package {

        import flash.events.Event;

        import org.papervision3d.materials.WireframeMaterial;

        import org.papervision3d.objects.primitives.Sphere;

        import org.papervision3d.view.BasicView;

        [SWF(width="640",height="480",backgroundColor="#000000",frameRate="30")]

        public class BasicViewExample extends BasicView {

                private var _sphere:Sphere;

                public function BasicViewExample() {

                        super();

                        init();

                }

                private function init():void {

                        setupSphere();

                        startRendering();

                }

                private function setupSphere():void {

                        _sphere=new Sphere(new WireframeMaterial  );

                        scene.addChild(_sphere);

                }

                override protected function onRenderTick(event:Event=null):void {

                        _sphere.rotationY+=2;

                        renderer.renderScene(scene,camera,viewport);

                }

        }

 

看效果

  

熟悉BasicView并熟練使用它,以後很多時候都會很友善的。

DisplayObject3D相當于FLASH中的DisplayObject,任何在螢幕上被渲染出來的3D物體都是它的子類,它的子類有以下這些:CameraObject3D, Collada, DAE, LightObject3D, Max3DS, Mouse3D, SimpleLevelOfDetail, Sketchup, SketchupCollada, Sound3D, Vertices3D,它們根據各自的實作或功能的不同分成了不同的類或者派生出不同的子類,這些以後再細看。

 

  現在我們隻要知道DisplayObject3D的一些常用屬性和方法,不清楚的查下文檔自己試驗一下。

  

scaleX

scaleY

scaleZ

scale 有這個就友善多了^_^

 

rotationX

rotationY

rotationZ

 

pitch()  對應rotationX

yaw()  對應rotationY

roll()  對應rotationZ

 

moveForward()  z正方向移動

moveBackward()  z反方向移動

  

moveRight()  x正方向移動

moveLeft()  x反方向移動

  

moveUp()  y正方向移動

moveDown()  y反方向移動

 

上面這些都是做運動時比較常用的,牢牢記住吧。

 

我們注意一下有個root的屬性,有時可能會用到,如果在scene裡的話root就是scene,否則為null。

 

另外看幾個暫時不用但以後會很有用的:

transform : Matrix3D

被用于該顯示對象的3D變換矩陣

   

translate(distance:Number, axis:Number3D):void

沿給定的矢量方向(axis:Number3D)移動給定的距離(distance:Number);

這裡的Number3D所表示的隻是一個方向,它的模的大小和移動的距離無關

  

transformVertices (transformation:Matrix3D) : void

試驗的時候發現這個文檔裡面沒有的方法,測試了一下,和transform的作用差不多,隻是這個是累加的

PV3D中材質的種類非常多,都是MaterialObject3D的子類,每個顯示對象都需要材質才能顯示。我們先來大緻看一下所有的材質類:

MaterialObject3D

————LineMaterial

————ParticleMaterial

————————BitmapParticleMaterial

————————MovieAssetParticleMaterial

————TriangleMaterial

————————AbstractLightShadeMaterial

————————————AbstractSmoothShadeMaterial

————————————————EnvMapMaterial

————————————————————CellMaterial

————————————————————PhongMaterial

————————————————GouraudMaterial

————————————FlatShadeMaterial

————————BitmapMaterial

————————————BitmapAssetMaterial

————————————BitmapColorMaterial

————————————BitmapFileMaterial

————————————BitmapViewportMaterial

————————————MovieMaterial

————————————————MovieAssetMaterial

————————————————VideoStreamMaterial

————————BitmapWireframeMaterial

————————ColorMaterial

————————CompositeMaterial

————————ShadedMaterial

————————WireframeMaterial

————VectorShapeMaterial

————————Letter3DMaterial

  上面列出了PV3D中所有的材質,大家可以先看一下,有個印象,以後用到的話友善查文檔。下面看一下比較常用的幾個。

ColorMaterial

  ColorMaterial是最常用的一個材質,它隻有單純的顔色和透明度,看下構造函數

ColorMaterial (color:Number = 0xFF00FF, alpha:Number = 1, interactive:Boolean = false)

主要說下interactive這個參數,如果你需要你的三維物體接收互動(例如滑鼠點選)的話要将它設為true,還有就是經常問到的一個問題,怎麼實作滑鼠手型,首先要将viewport的interactive設為true,然後将材質的interactive也設為true以後,在顯示對象上監聽InteractiveScene3DEvent.OBJECT_OVER事件,監聽器中将viewport的buttonMode設為true(前面說過viewport是Sprite的子類,是以可以設定buttonMode),滑鼠離開事件裡再設為false就可以了,關于互動以後會專門學習下給大家分享。

  照例上代碼:

?[Copy to clipboard]View Code ACTIONSCRIPT3package  

{

        import gs.TweenLite;

        import org.papervision3d.events.InteractiveScene3DEvent;

        import org.papervision3d.materials.ColorMaterial;

        import org.papervision3d.objects.primitives.Plane;

        import org.papervision3d.view.BasicView;

        public class InteractivePlane extends BasicView

        {

                private var _plane:Plane

                private var _material:ColorMaterial;

                public function InteractivePlane() 

                {

                        super();

                        init()

                }

                private function init():void

                {

                        initPanel();

                        startRendering();

                }

                private function initPanel():void

                {

                        _material = new ColorMaterial(0x1D9DAD, 1, true);

                        _material.interactive = true;

                        _plane = new Plane(_material,500,500);

                        _plane.rotationX = 45;

                        scene.addChild(_plane);

                        viewport.interactive = true;

                        _plane.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, onOver);

                        _plane.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, onOut);                        

                        _plane.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, onClick);                        

                }

                private function onClick(e:InteractiveScene3DEvent):void 

                {

                        _material.fillColor = Math.random() * 0xffffff;

                }

                private function onOver(e:InteractiveScene3DEvent):void 

                {

                        viewport.buttonMode = true;

                        TweenLite.to(_plane, 1, { rotationX:0 } );

                }

                private function onOut(e:InteractiveScene3DEvent):void 

                {

                        viewport.buttonMode = false;

                        TweenLite.to(_plane, 1, { rotationX:45 } );

                }

        }

 

  代碼中建立了一個平面,然後給它了一個ColorMaterial的材質,然後監聽滑鼠的OVER,OUT,CLICK事件,當滑鼠移上去的時候平面轉動一定角度并出現手型,移開的話轉動複原手型消失,當點選的時候給ColorMaterial的fillColor屬性重新指派改變平面顔色。

  看效果 

 

  另外比較常用的還有位圖材質BitmapMaterial和帶陰影的材質FlatShadeMaterial,使用方法網上都很多大家google一下。

繼續閱讀