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); } } }