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 }