`
hereson
  • 浏览: 1454169 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Papervision3D の BitmapMaterial と MovieMaterial の使用

    博客分类:
  • Pv3d
阅读更多
package {

  import flash.display.*;
  import flash.events.*;
  import flash.geom.*;
  import flash.text.*;

  import org.papervision3d.scenes.*;
  import org.papervision3d.objects.*;
  import org.papervision3d.cameras.*;
  import org.papervision3d.materials.*;

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

  // BitmapMaterial と MovieMaterial (テキスト表示) のサンプル
  public class MaterialSample extends Sprite {

    private var container : Sprite;
    private var scene     : Scene3D;
    private var camera    : Camera3D;
    private var rootNode  : DisplayObject3D;

    private var obj:Array = new Array();

    // 3Dオブジェクト踊らせ用パラメータ
    private var valx    : Number = 0;
    private var valy    : Number = 0;

    // Bitmap
    private var bitmapdata:BitmapData;

    // Text
    private var text:TextField;
    private var material:MovieMaterial

    public function MaterialSample():void {

      // 画面いっぱいに表示(縦横比無視)したいときはコレを使う
      // stage.scaleMode = StageScaleMode.EXACT_FIT;

      // リサイズに対応(swfをブラウザで直接ひらいているときとか)
      stage.addEventListener(Event.RESIZE, onStageResize);

      // 定期的にイベント発生
      addEventListener(Event.ENTER_FRAME, myLoopEvent);

      // マウスクリックでイベント発生
      stage.addEventListener(MouseEvent.CLICK, myClick);

      // 表示用の Sprite オブジェクトを生成
      container = new Sprite();
      container.x = 400 / 2; // at center : swf width  = 400
      container.y = 400 / 2; // at center : swf height = 400
      addChild(container);

      // シーンオブジェクトを作る
      scene = new Scene3D(container);

      // カメラオブジェクトを作る
      camera = new Camera3D();
      camera.z = -200;
      camera.focus = 500;
      camera.zoom = 1;

      // ルートノードを作る
      rootNode = new DisplayObject3D();
      scene.addChild(rootNode);

      // いろんな3Dオブジェクトを作ってみて、配列に入れておく
      obj.push(createWireframePlane());
      obj.push(createBitmapPlane());
      obj.push(createTextPlane());
      obj.push(createTextCube());

      // 3Dオブジェクトをルートノードに追加
      for(var i:int; i<obj.length; i++){
        rootNode.addChild(obj[i]);
      }
    }

    private function createWireframePlane():DisplayObject3D {

      var material:WireframeMaterial = new WireframeMaterial();
      material.oneSide = false;
      material.lineColor = 0x00FF00;
      material.lineAlpha = 1;

      var planeSize:int = 200;
      var segment:int = 2;

      var plane:Plane = new Plane(
        material, planeSize, planeSize, segment, segment);
      plane.x =   0;
      plane.y =  180;
      plane.z =   0;
      return plane;
    }

    private function createBitmapPlane():DisplayObject3D {

      var bd:BitmapData = new BitmapData(100, 100, false);
      this.bitmapdata = bd; // using this
      var material:BitmapMaterial = new BitmapMaterial(bd);

      material.oneSide = false;
      material.lineColor = 0x00FF00;
      material.lineAlpha = 1;

      var planeSize:int = 200;
      var segment:int = 2;

      var plane:Plane = new Plane(
        material, planeSize, planeSize, segment, segment);
      plane.x =  -180;
      plane.y =  0;
      plane.z =  0;
      return plane;
    }

    private function createTextPlane():DisplayObject3D {

      var asset:MovieClip = createMovieClip();
      var transparent:Boolean = true;
      var initObject:Object = {animated:true, doubleSided:true};

      var material:MovieMaterial = new MovieMaterial(asset, transparent, initObject);
      this.material = material; // using this

      var planeSize:int = 200;
      var segment:int = 2;

      var plane:Plane = new Plane(
        material, planeSize, planeSize, segment, segment);
      plane.x =  180;
      plane.y =  0;
      plane.z =  0;
      return plane;
    }

    private function createTextCube():DisplayObject3D {

      var planeSize:int = 200;
      var segment:int = 2;

      // using this
      var cube:Cube = new Cube(
        this.material, planeSize, planeSize, planeSize, segment, segment, segment);
      cube.x =  0;
      cube.y =  0;
      cube.z =  0;
      return cube;
    }

    private function createMovieClip():MovieClip {
      var mc:MovieClip = new MovieClip();
      var text:TextField = createTextField();
      text.text = getPropertiesString(mc);
      mc.addChild(text);
      this.text = text; // using this
      return mc;
    }

    private static function createTextField():TextField{

      // 表示メッセージのスタイル
      var format:TextFormat = new TextFormat();
      format.bold = false;
      format.italic = false;
      format.size = 10;
      format.underline = false;
      format.font = "_等幅";

      // 表示メッセージ
      var text:TextField = new TextField();
      text.autoSize = TextFieldAutoSize.LEFT;
      text.selectable = false;
      text.setTextFormat(format);
      text.background = true;
      text.backgroundColor = 0x000000;
      text.border = false;
      text.borderColor = 0xFFFFFF;
      text.textColor = 0xFFFFFF;

      return text;
    }

    // 最初だけこんなの表示してみる
    private static function getPropertiesString(mc:MovieClip):String {
        var str:String = ""
        + "currentFrame: " + mc.currentFrame + "\n"
        + "currentLabel: " + mc.currentLabel + "\n"
        + "currentScene: " + mc.currentScene + "\n"
        + "framesLoaded: " + mc.framesLoaded + "\n"
        + "totalFrames: " + mc.totalFrames + "\n"
        + "trackAsMenu: " + mc.trackAsMenu + "\n";
      return str;
    }

    private function myClick(event:MouseEvent):void {

      // update Bitmap
      // Math.random: (0 <= n < 1)
      var x:int = (int)(Math.random() * 100);
      var y:int = (int)(Math.random() * 100);
      // bitmapdata.setPixel(x, y, 0xFF0000);
      var rect:Rectangle = new Rectangle(x, y, 20, 20);
      bitmapdata.fillRect(rect, 0xFF0000);

      // update Text
      text.border = !text.border; // ワクを付けたり消したり
      text.background = !text.background; // 背景を付けたり消したり

      text.text = "マウスを\nクリックした位置:\nLocation(" + container.mouseX + "," + container.mouseY + ")";
      material.updateBitmap(); // 更新を通知
      //scene.renderCamera(camera);
    }

    private function myLoopEvent(event:Event):void {

      valx += container.mouseX / 50;
      valy += container.mouseY / 50;

      for(var i:int; i<obj.length; i++){
        obj[i].rotationY = valx;
        obj[i].rotationX = valy;
      }

      scene.renderCamera(camera);
    }

    private function onStageResize(event:Event):void {
      container.x = stage.stageWidth  / 2;
      container.y = stage.stageHeight / 2;
    }
   
  }
}
分享到:
评论

相关推荐

    Papervision3D 教程打包下载

    7. **Papervision3D中文帮助**:这个教程包特别包含了中文帮助文档,对于中文使用者来说是一大福音,它可以帮助初学者更轻松地理解Papervision3D的概念和技术,克服语言障碍。 8. **实战教程**:教程可能涵盖了从...

    Papervision3D.Essentials

    综上所述,《Papervision3D.Essentials》不仅是一本入门指南,更是一部详尽的技术手册,旨在帮助读者克服在使用Papervision3D过程中可能遇到的各种挑战,并通过实际案例加深对这项技术的理解和掌握。无论是对于初学...

    Papervision3D-demo.rar_DEMO_Papervision3D demo_Papervision3D mxm

    本资源包“Papervision3D-demo.rar”包含了7个使用Papervision3D引擎制作的实例源码,是学习和理解Papervision3D功能与应用的宝贵资料。 1. **Papervision3D基础知识** - **渲染引擎**:Papervision3D是一个强大的...

    PaperVision3D

    PaperVision3D使用ActionScript 3.0(AS3.0)进行编程,这是一种面向对象的脚本语言,相较于AS2.0,其性能显著提升,内存管理更加高效。通过PaperVision3D,开发者可以创建3D模型、纹理、灯光、相机视角等元素,并在...

    Papervision3D

    Papervision3D是一个基于ActionScript 3.0的开源框架,专为在Adobe Flash环境中构建三维(3D)图形和应用而设计。这个框架的出现极大地扩展了Flash平台的功能,使得开发者能够利用Flash Player在网页上创建复杂的3D...

    papervision3D

    例如,可以使用Papervision3D构建一个3D购物网站,让用户从各个角度查看商品;或者开发一款3D游戏,提供沉浸式的游戏体验。同时,Papervision3D也支持自定义渲染管道,这意味着开发者可以根据需求调整和优化渲染过程...

    Papervision3D的API

    《Papervision3D API详解》 Papervision3D(PV3D)是Flash平台上的一款强大的3D图形库,它允许开发者在网页上创建丰富的、交互式的三维图形和应用程序。本篇文章将深入探讨Papervision3D的API,帮助读者理解并掌握...

    papervision3d_868.swc

    PaperVision3D是Flash Platform上的一个强大工具,它允许开发者使用熟悉的ActionScript语言来创建复杂的3D场景和动画。PV3D不仅提供了一整套的3D对象和渲染功能,还支持光照、纹理、碰撞检测等高级特性,使得在Web上...

    初识Papervision3D

    使用Papervision3D,开发者可以创建自定义的3D对象,或者使用内置的几何对象库。同时,通过编程控制这些对象的位置、旋转和缩放,实现动态效果。此外,Papervision3D还支持导入3D模型文件,如 COLLADA 和 OBJ 格式,...

    Papervision3D.swc

    Papervision3D_2.0.869.swc

    《Papervision3D+Essentials》中文翻译

    《Papervision3D+Essentials》是一本专注于Papervision3D技术的权威指南,对于深入了解和掌握这个强大的3D图形库至关重要。Papervision3D(简称PV3D)是Flash平台上最早的3D渲染引擎之一,它为开发者提供了在Web...

    papervision3d的swc源码和书籍

    《Papervision3D:SWC源码与学习资源详解》 Papervision3D,作为一款强大的开源框架,为Flash平台提供了强大的3D渲染能力,它使得开发者能够利用ActionScript3在Web上创建出令人震撼的3D交互体验。本篇文章将围绕...

    papervision3d和物理引擎Box2DFlash的一个超酷且好玩的DEMO

    《Papervision3D与Box2DFlash结合的精彩DEMO解析》 在IT行业中,3D图形渲染和物理引擎的应用已经变得越来越普遍,尤其是在游戏开发和互动媒体设计领域。Papervision3D是一个基于Adobe Flash平台的开源3D库,它允许...

    papervision3d 精髓

    《Papervision3D精髓》一书是针对初学者及有一定基础的开发者设计的,旨在教授如何使用Papervision3D(PV3D)创建具有惊人效果和强大动画功能的交互式3D应用程序。PV3D是一种开源的3D引擎,用于Adobe Flash平台,它...

    PV3d Papervision3d API文档+学习笔记+全景案例

    《PV3d Papervision3D API文档与全景案例解析》 Papervision3D(PV3D)是一款强大的开源3D图形引擎,专为Adobe Flash平台设计,支持ActionScript 3.0(AS3),是Flash AS3中实现3D效果的重要工具。在本文中,我们将...

    Papervision3D.doc

    接着,你需要在主类文件(Main.as)中编写使用Papervision3D的代码。以下是一个简单的示例,展示了如何创建一个基本的3D场景: ```actionscript package { import flash.display.Sprite; import org.papervision...

Global site tag (gtag.js) - Google Analytics