Stage3Dを使用してWebcam映像を表示する、Away3Dでね。
Flash Player 11.4 からだとStageVideoにもattachCameraが追加されるので苦労はいらなくなるけど。
http://labs.adobe.com/technologies/flashplatformruntimes/flashplayer11-4/
Away3Dも先日4.0 Goldが出たので記念に使ってみます。
http://away3d.com/comments/away3d_4.0_gold
Starlingにも対応してるらしいけど、そこらはまだ良くわかってない。
package { import away3d.cameras.Camera3D; import away3d.cameras.lenses.PerspectiveLens; import away3d.containers.View3D; import away3d.lights.PointLight; import away3d.textures.BitmapTexture; import flash.display.BitmapData; import flash.display.Sprite; import flash.events.Event; import flash.geom.Matrix; import flash.media.Camera; import flash.media.Video; [SWF(frameRate="60", width="640", height="480", backgroundColor="#DDDDDD")] public class Stage3DWebcam extends Sprite { private var _view : View3D; private var _camera : Camera3D; private var _light : PointLight; private var _cam : Camera; private var _vid : Video; private var _bmd : BitmapData; private var _matrix : Matrix; public function Stage3DWebcam() { init(); } private function init() : void { _matrix = new Matrix(-1, 0, 0, 1, 320, 0); var view3D : View3D = new View3D(); _view = view3D; view3D.backgroundColor = 0xefefef; view3D.antiAlias = 4; view3D.width = 640; view3D.height = 480; // Camera var camera : Camera3D = _camera = view3D.camera; camera.lens = new PerspectiveLens(); camera.lens.far = 100000; // Light var pointLight : PointLight = new PointLight(); _light = pointLight; pointLight.z = -300; pointLight.color = 0xffffff; pointLight.specular = 0.15; view3D.scene.addChild(pointLight); addChildAt(view3D, 0); _cam = Camera.getCamera(); var cam : Camera = _cam; if (!cam) { throw new Error("No camera!"); return; } else { setupCamera(cam); addEventListener(Event.ENTER_FRAME, onLoop); } } private function setupCamera(cam : Camera) : void { cam.setMode(320, 240, 30); var video : Video = new Video(); _vid = video; video.width = 320; video.height = 240; video.attachCamera(cam); _bmd = new BitmapData(256, 256, false, 0x111111); drawVideo(); } private function onLoop(e : Event) : void { var view : View3D = _view; view.background = new BitmapTexture(_bmd); drawVideo(); view.render(); } private function drawVideo() : void { _bmd.draw(_vid, _matrix); } } } |
初めてのAway3DをWebcamを表示するためだけに使ったことをお許しください。
なんか全然わからないけど、表示はできました。
表示される画像は鏡像になるようにMatrixで反転しています。
view.background = new BitmapTexture(_bmd);
ここがポイントでした。
古いバージョンだとview
にbackgroundImage
プロパティが存在して直接Bitmapを設定できたみたい。
BitmapTexture で使う BitmapData のサイズは2048の偶数分の1じゃないといけないって分かったのが一歩前進。
FBからFDTに乗換中でまだこちらもうまく使えていない。
Webコンテンツとして作ったけど、wmodeをdirectにしてBrowserでDebugする方法がわからない。
いちいちDesktopへ戻ってhtmlをクリックしている自分が愛おしかったりします。
Stage3D, StageVideoと魅力的な新機能の登場とAway3D, Alternativa3D, Starling, ANEと作り手の心をくすぐるライブラリやFrameworkなどなど、やりたいことは山積みなのになかなか時間をとれずにいました。
随分出遅れてたけど久しぶりのActionScriptはやっぱり楽しかった。
しかも気兼ね無しのプライベート・ワークなのでなおさらです。
【制作環境】
FDT 5.5
Flex 4.6
Away3D 4.0.7