zoukankan      html  css  js  c++  java
  • 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;

            /**
             * ...
             * @author AntScript
             * @blog   http://www.antscript.cn
             */
            [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;

            /**
             * ...
             * @author AntScript
             * @blog http://www.AntScript.cn
             */
            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一下。

  • 相关阅读:
    python 基础2.5 循环中continue与breake用法
    python 基础 2.4 while 循环
    python 基础 2.3 for 循环
    python 基础 2.2 if流程控制(二)
    python 基础 2.1 if 流程控制(一)
    python 基础 1.6 python 帮助信息及数据类型间相互转换
    python 基础 1.5 python数据类型(四)--字典常用方法示例
    Tornado Web 框架
    LinkCode 第k个排列
    LeetCode 46. Permutations
  • 原文地址:https://www.cnblogs.com/leon3286/p/1768318.html
Copyright © 2011-2022 走看看