1 // mxmlc -output /Users/shin_ishimaru/Sites/Video3D/Video3D.swf -benchmark=true -default-size 240 240 -default-frame-rate=60 -default-background-color=0xFFFFFF Video3D.as
  2 
  3 package
  4 {
  5     import flash.display.*;
  6     import flash.events.*;
  7     import flash.media.*;
  8     import flash.net.*;
  9     import flash.text.*;
 10     import flash.filters.*;
 11 
 12     import org.papervision3d.scenes.*;
 13     import org.papervision3d.objects.*;
 14     import org.papervision3d.cameras.*;
 15     import org.papervision3d.materials.*;
 16 
 17     [SWF(backgroundColor=0xffffff)]
 18 
 19     public class Video3D extends Sprite
 20     {
 21         // _______________________________________________________________________
 22         //                                                                  vars3D
 23         private var container : Sprite;
 24         private var scene     : MovieScene3D;
 25         private var camera    : Camera3D;
 26 
 27         private var planeObj  : DisplayObject3D;
 28         private var planeSize : int = 300;      //Planeオブジェクト1辺の長さ
 29         private var segment   : int = 1;        //面の分割数
 30         private var material  : BitmapMaterial;
 31         private var bmpData   : BitmapData;
 32         private var connection: NetConnection;    //コネクション
 33         private var stream    : NetStream;        //ストリーム
 34         private var video     : Video;
 35         private var label     : TextField;
 36 
 37         private var valx      : Number = 0;
 38         private var valy      : Number = 0;
 39         private var count     : uint = 0;
 40 
 41         static public const
 42             TEXTURE_W:int = 240,    ///< テクスチャの幅
 43             TEXTURE_H:int = 240;    ///< テクスチャの高さ
 44 
 45         // _______________________________________________________________________
 46         //                                                             Constructor
 47         public function Video3D():void
 48         {
 49             stage.frameRate = 60;
 50             stage.quality   = "MEDIUM";
 51             stage.scaleMode = "noScale";
 52             stage.align = StageAlign.TOP_LEFT;
 53             this.addEventListener(Event.ENTER_FRAME, loop3D);
 54             this.stage.addEventListener(Event.RESIZE, onStageResize);
 55 
 56             label=new TextField();
 57             label.autoSize=TextFieldAutoSize.LEFT;
 58             addChild(label);
 59 
 60             init3D();
 61 
 62             //コネクションの生成
 63             connection=new NetConnection();
 64 
 65             //イベントリスナーの追加
 66             connection.addEventListener(
 67                 NetStatusEvent.NET_STATUS,netStatusHandler);
 68             connection.addEventListener(
 69                 SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
 70 
 71             //ファイルとの接続を確立
 72             connection.connect(null);
 73         }
 74         //ネット状態イベントの処理
 75         private function netStatusHandler(evt:NetStatusEvent):void {
 76             switch (evt.info.code) {
 77                 //成功
 78                 case "NetConnection.Connect.Success":
 79                     //ストリームの生成
 80                     stream = new NetStream(connection);
 81 
 82                     //イベントリスナーの追加
 83                     stream.addEventListener(
 84                         NetStatusEvent.NET_STATUS,netStatusHandler);
 85                     stream.addEventListener(
 86                         AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler);
 87 
 88                     //動画の表示領域の生成
 89                     video = new Video();
 90                     video.attachNetStream(stream);
 91 
 92                     //動画ストリーミングの再生開始
 93                     stream.play("sample.flv");
 94                     label.text="FLV読み込み成功";
 95                     break;
 96                 //ファイルが見つからない
 97                 case "NetStream.Play.StreamNotFound":
 98                     label.text="ファイルが見つからない";
 99                     break;
100                 //繰り返し再生
101                 case "NetStream.Play.Stop":
102                     stream.seek(0);
103                     break;
104             }
105         }
106 
107         //非同期エラーイベントの処理
108         private function asyncErrorHandler(evt:AsyncErrorEvent):void {
109         }
110 
111         //セキュリティエラーイベントの処理
112         private function securityErrorHandler(evt:SecurityErrorEvent):void {
113             label.text="セキュリティエラー";
114         }
115 
116         // _______________________________________________________________________
117         //                                                                  Init3D
118         private function init3D():void
119         {
120             //コンテナ生成
121             this.container = new Sprite();
122             addChild(this.container);
123             this.container.x = this.stage.stageWidth  / 2;
124             this.container.y = this.stage.stageHeight / 2;
125 
126             //シーン生成
127             scene = new MovieScene3D( container );
128 
129             //カメラ設定
130             camera = new Camera3D();
131             camera.z = -planeSize;
132             camera.focus = 500;
133             camera.zoom = 1;
134 
135             //BitmapDataの作成。Bitmapに角丸矩形を描く
136             bmpData = new BitmapData(TEXTURE_W,TEXTURE_H,false,0xff0000);
137 
138             //マテリアル設定
139             material = new BitmapMaterial(bmpData);
140             material.oneSide = false;
141 
142             //Planeオブジェクト生成
143             planeObj = scene.addChild( new Cube( material, planeSize, planeSize, planeSize, segment, segment, segment) );
144 
145         }
146 
147         // _______________________________________________________________________
148         //                                                                    Loop
149         private function loop3D( event:Event ):void
150         {
151             valx -= 0.2;
152             valy -= 0.5;
153             planeObj.rotationY = valx;
154             planeObj.rotationX = 45;
155 
156             //ビデオをテクスチャに書き込む
157             video.attachNetStream(null);
158             bmpData.draw(video);
159             video.attachNetStream(stream);
160 
161             //フィルタかける
162             var filters:Array = new Array;
163             filters.push(new DropShadowFilter(20, 45, 0x000000, 0.8, 5, 5, 1, BitmapFilterQuality.HIGH, false, false, false));
164             //ブラー
165             var blur:Number = 10*Math.sin( (++count/25) );
166             if(blur > 0){
167                 filters.push(new BlurFilter(blur,blur,BitmapFilterQuality.HIGH));
168             }
169             planeObj.container.filters = filters;
170 
171             //レンダリング
172             this.scene.renderCamera( camera );
173         }
174 
175         // _______________________________________________________________________
176         //                                                           onStageResize
177         private function onStageResize(event:Event):void
178         {
179             this.container.x = this.stage.stageWidth  / 2;
180             this.container.y = this.stage.stageHeight / 2;
181         }
182 
183     }
184 }