2009
06.25.

 初步研究FLASH 3D引擎。做的一个很简单的效果,学习了3D引擎的基本概念、贴图、交互精确到面。代码如下:

package {
 import flash.display.Bitmap;
 import flash.display.StageAlign;
 import flash.display.StageScaleMode;
 import flash.events.Event;
 
 import org.papervision3d.core.utils.InteractiveSceneManager;
 import org.papervision3d.events.InteractiveScene3DEvent;
 import org.papervision3d.materials.BitmapMaterial;
 import org.papervision3d.materials.utils.MaterialsList;
 import org.papervision3d.objects.primitives.Cube;
 import org.papervision3d.view.BasicView

 [SWF(width="980", height="300", frameRate="24", backgroundColor="#999999")]
 public class HomeObject extends BasicView
 {
  private static const ORBITAL_RADIUS:Number = 200;
  private var theta:Number = 0;
  //立方体
     private var _cube:Cube
     //交互管理
     private var _interactiveSceneManager:InteractiveSceneManager;
  //是否旋转开关    
     private var isXuanzhuan:Boolean = true;
  
  //绑定贴图文件
  [Embed(source="src/1.jpg")] private var MyTextureImage1:Class;
  [Embed(source="src/2.jpg")] private var MyTextureImage2:Class;
  [Embed(source="src/3.jpg")] private var MyTextureImage3:Class;
  [Embed(source="src/4.jpg")] private var MyTextureImage4:Class;
 
  private var MyTextureImage:Class;
  private var bitmap1:Bitmap = new MyTextureImage1();
  private var bitmap2:Bitmap = new MyTextureImage2();
  private var bitmap3:Bitmap = new MyTextureImage3();
  private var bitmap4:Bitmap = new MyTextureImage4();

  
  public function HomeObject()
  {
   //实例一个VIEWPORT
   super(0, 0, true, true);
   // set up the stage
   stage.align = StageAlign.TOP_LEFT;
   stage.scaleMode = StageScaleMode.NO_SCALE;
     
        //初始摄像机
   init3D();
   //建立场景
   createScene();
   //开始渲染场景
   startRendering();
  }
  
     private function init3D():void {
      // position the camera
      camera.x = -200;
      camera.y =  150;
      camera.z = -400;
     
       _interactiveSceneManager = new InteractiveSceneManager(this.viewport)
       _interactiveSceneManager.addEventListener(InteractiveScene3DEvent.OBJECT_CLICK, clickHandle);

    }
    private function createScene():void
    {
  //定义材质
     
   var bitmapMaterial11:BitmapMaterial = new BitmapMaterial(bitmap1.bitmapData, true);
   var bitmapMaterial12:BitmapMaterial = new BitmapMaterial(bitmap2.bitmapData, true);
   var bitmapMaterial13:BitmapMaterial = new BitmapMaterial(bitmap3.bitmapData, true);
   var bitmapMaterial14:BitmapMaterial = new BitmapMaterial(bitmap4.bitmapData, true);
   
   //设置材质是否可以交互
   bitmapMaterial11.interactive = bitmapMaterial12.interactive = bitmapMaterial13.interactive = bitmapMaterial14.interactive =  true
   
   //平滑材质
   bitmapMaterial11.smooth = bitmapMaterial12.smooth = bitmapMaterial13.smooth = bitmapMaterial14.smooth = true
   
   //定义每个面的name
   bitmapMaterial11.name = "1"
   bitmapMaterial12.name = "2"
   bitmapMaterial13.name = "3"
   bitmapMaterial14.name = "4"
   
     
       //6个面的材质
      var materiallist:MaterialsList = new MaterialsList();
   materiallist.addMaterial(bitmapMaterial11,"top");
   materiallist.addMaterial(bitmapMaterial11,"bottom");
   materiallist.addMaterial(bitmapMaterial12,"front");
   materiallist.addMaterial(bitmapMaterial14,"back");
   materiallist.addMaterial(bitmapMaterial11,"left");
   materiallist.addMaterial(bitmapMaterial13,"right");
     
   //立方体
   _cube = new Cube(materiallist,150,150,150,10,10,10,0,0)
   scene.addChild(_cube)
     
   _cube.addEventListener(InteractiveScene3DEvent.OBJECT_OVER, stopMove)
   _cube.addEventListener(InteractiveScene3DEvent.OBJECT_OUT, startMove)
    }
   
   
    override protected function onRenderTick(event:Event=null):void
    {
     //选中立方体
  if(isXuanzhuan)
  {
       _cube.yaw(-3)
       
       //渲染
       super.onRenderTick(event);
       
       //立体旋转
       theta += 3;
   var x:Number = - Math.cos(theta * Math.PI / 180) * ORBITAL_RADIUS;
   var z:Number =   Math.sin(theta * Math.PI / 180) * ORBITAL_RADIUS;
      
   _cube.x = x;
   _cube.z = z;
  } 
    }
   
    private function stopMove(e:InteractiveScene3DEvent):void
    {
     isXuanzhuan = false
    }
   
    private function startMove(e:InteractiveScene3DEvent):void
    {
     isXuanzhuan = true
    }
   
    private function clickHandle(e:InteractiveScene3DEvent):void
    {
     switch(e.face3d.material.name)
     {
      case "1":
       trace("第一张图片");
       break;
      case "2":
       trace("第二张图片");
       break;
      case "3":
       trace("第三张图片");
       break;
      case "4":
       trace("第四张图片");
       break;
     }
    }

 

 }
}

2 条评论 立即发表评论

  1. [...] 刚骂完三星,还给他们做了个东西,没办法,工作内容。这是个3D魔方的挂件,使用了PV3D,之前的文章里有这个的基本源码,当然有改动。APP地址:http://apps.51.com/s8000c [...]

    Pingback by 3D魔方 | 土豆的大地 — 2009年9月24日 @ 09:48

  2. 学习学习

    评论 by BestDong — 2009年9月27日 @ 22:10

这篇文章上的评论的 RSS feed TrackBack URL

留下评论

页码: 1 of 0

©2009 All Rights Reserved. Powered by WordPress. Skin was designed by VDIT.com