Papervision3Dで遊んだ

 ActionScript3.0向けの3DライブラリであるPapervision3Dを使って遊んでみました。

 PV3Dについてのお勉強はこちらがおすすめ→Papervision3Dやってみる(4) 【マテリアル】 | FlaTech+WebDesign Rainyday

 昔大学の講義で3DCGを作った事がありましたが、こっちの方が全然楽しいね!比較的簡単に動画をテクスチャとして貼付けられました。
 立方体をまわしながら動画を再生すると変に歪むけど、これはしょうがないのかな・・・。

立方体に動画をテクスチャとして貼付ける

以下、PV3DTest.as。

package
{
	import flash.events.Event;
	import flash.events.NetStatusEvent;
	import flash.media.Video;
	import flash.net.NetConnection;
	import flash.net.NetStream;
	
	import org.papervision3d.materials.BitmapFileMaterial;
	import org.papervision3d.materials.VideoStreamMaterial;
	import org.papervision3d.materials.utils.MaterialsList;
	import org.papervision3d.objects.primitives.Cube;
	import org.papervision3d.objects.primitives.Sphere;
	import org.papervision3d.view.BasicView;

	/**
	 * Papervision3Dをお試しで使ってみたクラス<br>
	 * ビルドバスにPapervision3Dのライブラリを追加しておくこと。<br>
	 * 
	 * @see http://code.google.com/p/papervision3d/downloads/list
	 * @see http://rainyday.jp/blog/flash/pv3d/PV3D_material.html
	 * @author shiraminekeisuke
	 * 
	 */
	public class PV3DTest extends BasicView
	{
		
		private var _mySphereForRotate:Sphere = null;
		
		private var _myCubeForRotate:Cube = null;
		
		private var _myCubeForStreaming:Cube = null;
		
		public function PV3DTest()
		{	
			// rotateCube and Streaming
			rotateCubeAndStreamVideo();
		}
		
		/**
		 * 立方体に動画を投影する
		 */
		private function rotateCubeAndStreamVideo():void{
			
			//カメラの座標設定
			camera.z = -600;
			
			//コネクションを確保( この辺の処理は http://livedocs.adobe.com/flex/3_jp/langref/index.html を参照 )
			var netConnection:NetConnection = new NetConnection();
			netConnection.addEventListener(NetStatusEvent.NET_STATUS, netStatusEventHandler);
			netConnection.connect(null);
			
			//NetConnectionおよびNetStreamのリスナ
			function netStatusEventHandler(event:NetStatusEvent):void{
				
				switch(event.info.code){
					//うまくConnectionが確立できたらconnectStreamを呼ぶ
					case "NetConnection.Connect.Success":
						connectStream();
						break;
					default:
						//Connectionを張る時以外はステータスを出す
						trace(event.info.code);
						break;
				}
				
			};
			
			//ストリーミングを開始
			function connectStream():void{
				//ストリームを開く準備
				var netStream:NetStream = new NetStream(netConnection);
				netStream.addEventListener(NetStatusEvent.NET_STATUS, netStatusEventHandler);
				netStream.client = new CustomClient();
				
				//ビデオの表示先を準備
				var video:Video = new Video(512, 384);
				video.attachNetStream(netStream);
				
				//ストリームを開く。ココに開きたいファイルの名前を記述。
				netStream.play("movie.flv");
				
				//マテリアルを作成
				var material:VideoStreamMaterial = new VideoStreamMaterial(video, netStream);
				
				//マテリアルをリストに格納
				var materialList:MaterialsList = new MaterialsList({
					all:material	//すべての面に動画を表示
				});
				
				//Cubeを作成
				_myCubeForStreaming = new Cube(materialList, 512, 512, 384);
				
				//Cubeを表示領域に追加
				scene.addChild(_myCubeForStreaming);
				
				//レンダリング開始
				startRendering();
				
			};
			
		}
		
		
		/**
		 * レンダリングごとに呼ばれるリスナー
		 * @param event
		 * 
		 */
		override protected function onRenderTick(event:Event=null):void{
			
			if(this._mySphereForRotate != null){
				this._mySphereForRotate.rotationX += 0.5;
				this._mySphereForRotate.rotationY += 0.2;
				this._mySphereForRotate.rotationZ += 0.1;
			}
			
			if(this._myCubeForRotate != null){
				this._myCubeForRotate.rotationY += 0.5;
			}
			
			if(this._myCubeForStreaming != null){
				this._myCubeForStreaming.rotationY += 0.5;
			}
			
			super.onRenderTick(event);
		}
		
	}
}

次、CustomClient.as。上で作ったNetStreamオブジェクトのリスナです。

package
{
	public class CustomClient {
		public function onMetaData(info:Object):void {
			trace("metadata: duration=" + info.duration + " width=" + info.width + " height=" + info.height + " framerate=" + info.framerate);
		}
		public function onCuePoint(info:Object):void {
			trace("cuepoint: time=" + info.time + " name=" + info.name + " type=" + info.type);
		}
	}
}