イナヅマTVログ

Stage3D, Away3Dを使ってWebcamを表示

| 0件のコメント

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);
ここがポイントでした。
古いバージョンだとviewbackgroundImageプロパティが存在して直接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

コメントを残す