Home > papervision3d > Papervision3DのMovieMaterialを使ってテクスチャを生成する方法

Papervision3DのMovieMaterialを使ってテクスチャを生成する方法

Papervision3Dのオブジェクトにテクスチャを貼付けるにはBitmapFileMaterialを使います。
しかし、これはあらかじめjpgやらpngやらを準備しておく必要があります。
面倒です。

ということで、今回は単純な文字ぐらいは自動でテクスチャを生成してラクしようという内容です。

MovieMaterialを使う

MovieMaterialのコンストラクタです。

MovieMaterial(asset:*, transparent:Boolean = false, initObject:Object = null)

transparentというのはtrueで透過、falseで不透過というだけの設定です。
あまり気にする必要はありません。

assetというのが肝です。
assetの型が決まっていません。だからといってなんでも良い訳ではありません。
手元にあるドキュメント(Wed Mar 28 2007, 5:46 PM GMT+01:00)には、

asset:* ― A String that contains an existing MovieClip library id.

と書いてあるので、まずはMovieClipを作ります。

var mc:MovieClip = new MovieClip();

MovieClipのコンストラクタは引数なしです。
ドキュメントではaddChildとかaddChildAtというメソッドを使えって書いてます。
addChildメソッドの定義はこうです。

addChild(child:DisplayObject):DisplayObject

このパラメータのDisplayObjectが実際に表示されるモノですね。
今回は「adamrocker」という文字を表示したいと思います。

文字のオブジェクトはTextFieldを使います。

var txt_field:TextField = new TextField();
var format:TextFormat = new TextFormat("Impact", size, color);
txt_field.text = "adamrocker";
txt_field.autoSize = TextFieldAutoSize.LEFT;
txt_field.setTextFormat(format);

可読性と利便性のためTextFieldを含んだMovieClipを生成するメソッドを定義しておきます。

private function get_clip(text:String, color:Number):MovieClip {
  var format:TextFormat = new TextFormat("Impact", size, color);
  var txt_field:TextField = new TextField();
  var mc:MovieClip = new MovieClip();
 
  txt_field.text = text;
  txt_field.autoSize = TextFieldAutoSize.LEFT;
  txt_field.setTextFormat(format);
  mc.addChild(txt_field);
 
  return mc;
}

これで準備完了。このメソッドを使ってマテリアルを作ります。

var mc:MovieClip = get_clip("adamrocker", 0xcccccc);
material = new MovieMaterial(mc, true);
material.doubleSided = true;

あとはいつもの通り、このマテリアルを使ってオブジェクトを作るだけです。
今回はPlaneを利用しています。

Source Code

上のSWFファイルのソースコードを公開しておきます。

package {
  import flash.display.*;
  import flash.events.*;
  import flash.text.*;
  import flash.display.Sprite;
  import org.papervision3d.core.proto.*;
  import org.papervision3d.scenes.MovieScene3D;
  import org.papervision3d.objects.Plane;
  import org.papervision3d.materials.MovieMaterial;
  import org.papervision3d.cameras.Camera3D;
  import org.papervision3d.objects.DisplayObject3D;
 
  [SWF(
       backgroundColor="0xffffff",
       frameRate="45"
      )]
 
  public class MyMovieClip extends Sprite
  {
    //each object parameters
    private var size      :int = 240;
    private var obj_segw  :int = 1;
    private var obj_segh  :int = 1;
 
    //global object
    private var container :Sprite;
    private var scene     :SceneObject3D;
    private var camera    :CameraObject3D;
    private var obj       :DisplayObject3D;
    private var material  :MaterialObject3D;
 
    public function MyMovieClip()
    {
      //ステージ
      this.stage.quality   = "MEDIUM";
      this.stage.scaleMode = "noScale";
      this.stage.align = StageAlign.TOP_LEFT;
      this.stage.addEventListener(Event.ENTER_FRAME, loop);
      this.stage.addEventListener(Event.RESIZE, resize);
 
      //コンテナ生成
      container = new Sprite();
      container.x = this.stage.stageWidth  / 2;
      container.y = this.stage.stageHeight / 2;
      addChild(container);
 
      //シーン生成
      scene = new MovieScene3D(container);
 
      //マテリアルの生成
      var mc:MovieClip = get_clip("adamrocker", 0xcccccc);
      material = new MovieMaterial(mc, true);
      material.doubleSided = true;
 
      //オブジェクトの生成
      obj = new Plane(material, size, size, obj_segw, obj_segh);
      scene.addChild(obj);
 
      //カメラ設定
      camera = new Camera3D();
      camera.z = size * 1.1;
      camera.zoom = 1.5;
 
      this.stage.addEventListener(Event.ENTER_FRAME, loop);
      this.stage.addEventListener(Event.RESIZE, resize);
      resize(null);
    }
 
    //--------------------------------------------------get_clip    
    private function get_clip(text:String, color:Number):MovieClip {
      var format:TextFormat = new TextFormat("Impact", size, color);
      var txt_field:TextField = new TextField();
      var mc:MovieClip = new MovieClip();
 
      txt_field.text = text;
      txt_field.autoSize = TextFieldAutoSize.LEFT;
      txt_field.setTextFormat(format);
      mc.addChild(txt_field);
 
      return mc;
    }
 
    //--------------------------------------------------loop  
    private function loop(e:Event):void {
      // 回転
      obj.rotationY += container.mouseY / 100;
      obj.rotationX += container.mouseX / 100;
 
      //再レンダリング
      scene.renderCamera(camera)
    }
 
    //-------------------------------------------------stage
    private function resize(e:Event):void {
      container.x = this.stage.stageWidth  / 2;
      container.y = this.stage.stageHeight / 2;
    }
  }
}
関連のありそうなエントリ

Comments:0

Comment Form
Remember personal info

*
To prove that you're not a bot, enter this code
Anti-Spam Image

Trackbacks:1

Trackback URL for this entry
http://www.adamrocker.com/blog/153/papervision3d_moviematerial_sample.html/trackback/
Listed below are links to weblogs that reference
Papervision3DのMovieMaterialを使ってテクスチャを生成する方法 from throw Life
trackback from Entacl Develop 08-02-20 (水) 21:24

Theme-1で作ったものを3D化してみました…

どうも。t-matsudaです。
Theme-1
「毎回変わる課題の題目を、Flashを使って表示する!」
を3D化してみました。
ソースは、リポジトリにコミットしてあ (more…)

Home > papervision3d > Papervision3DのMovieMaterialを使ってテクスチャを生成する方法

Search
Feeds
Meta

Return to page top