- 2007-09-01 23:06
- papervision3d
Papervision3Dのオブジェクトにテクスチャを貼付けるにはBitmapFileMaterialを使います。
しかし、これはあらかじめjpgやらpngやらを準備しておく必要があります。
面倒です。
ということで、今回は単純な文字ぐらいは自動でテクスチャを生成してラクしようという内容です。
MovieMaterialのコンストラクタです。
MovieMaterial(asset:*, transparent:Boolean = false, initObject:Object = null)
transparentというのはtrueで透過、falseで不透過というだけの設定です。
あまり気にする必要はありません。
assetというのが肝です。
assetの型が決まっていません。だからといってなんでも良い訳ではありません。
手元にあるドキュメント(Wed Mar 28 2007, 5:46 PM GMT+01:00)には、
と書いてあるので、まずは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を利用しています。
上の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
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…)
