package org.tarotaro.flash.ar { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.PixelSnapping; import flash.display.Sprite; import flash.events.*; import flash.geom.Rectangle; import flash.media.Camera; import flash.media.Video; import flash.net.URLRequest; import flash.utils.ByteArray; import org.libspark.flartoolkit.core.FLARCode; import org.libspark.flartoolkit.core.param.FLARParam; import org.libspark.flartoolkit.core.raster.rgb.FLARRgbRaster_BitmapData; import org.libspark.flartoolkit.core.transmat.FLARTransMatResult; import org.libspark.flartoolkit.detector.FLARSingleMarkerDetector; import org.libspark.flartoolkit.support.pv3d.FLARBaseNode; import org.libspark.flartoolkit.support.pv3d.FLARCamera3D; import org.papervision3d.materials.MovieMaterial; import org.papervision3d.objects.primitives.Plane; import org.papervision3d.render.LazyRenderEngine; import org.papervision3d.scenes.Scene3D; import org.papervision3d.view.Viewport3D; import org.tarotaro.flash.display.RSSMatrixView; /** * ... * @author ... */ [SWF(width="640", height="480", backgroundColor="0x000000", frameRate="30")] public class FLARSSMatrixView extends Sprite { protected var _param:FLARParam; protected var _code:FLARCode; protected var _raster:FLARRgbRaster_BitmapData; protected var _detector:FLARSingleMarkerDetector; protected var _webcam:Camera; protected var _video:Video; protected var _capture:Bitmap; protected var _base:Sprite; protected var _viewport:Viewport3D; protected var _camera3d:FLARCamera3D; protected var _scene:Scene3D; protected var _renderer:LazyRenderEngine; protected var _markerNode:FLARBaseNode; protected var _resultMat:FLARTransMatResult = new FLARTransMatResult(); [Embed(source = "assets/camera_para.dat", mimeType = "application/octet-stream")] private var CParam:Class; [Embed(source = "assets/patt.hiro", mimeType = "application/octet-stream")] private var CodeData:Class; public function FLARSSMatrixView() { addEventListener(Event.INIT, _onInitRSS); setup(); } private function setup():void { var codeFile:ByteArray = new CodeData() as ByteArray; _param = new FLARParam(); _param.loadARParam(new CParam() as ByteArray); _param.changeScreenSize(320, 240); _code = new FLARCode(16,16); _code.loadARPatt(codeFile.readMultiByte(codeFile.length, "shift-jis")); // setup webcam _webcam = Camera.getCamera(); if (!_webcam) { throw new Error('No webcam!!!!'); } _webcam.setMode(320, 240, 30); _video = new Video(320, 240); _video.attachCamera(_webcam); _capture = new Bitmap(new BitmapData(320, 240, false, 0), PixelSnapping.AUTO, true); // setup ARToolkit _raster = new FLARRgbRaster_BitmapData(_capture.bitmapData); _detector = new FLARSingleMarkerDetector(_param, _code, 80); _detector.setContinueMode(true); _base = addChild(new Sprite()) as Sprite; _capture.width = 640; _capture.height = 480; _base.addChild(_capture); _viewport = _base.addChild(new Viewport3D(320, 240)) as Viewport3D; _viewport.scaleX = 640 / 320; _viewport.scaleY = 480 / 240; _viewport.x = -4; // 4pix ??? _camera3d = new FLARCamera3D(_param); _scene = new Scene3D(); _markerNode = _scene.addChild(new FLARBaseNode()) as FLARBaseNode; _renderer = new LazyRenderEngine(_scene, _camera3d, _viewport); addEventListener(Event.ENTER_FRAME, _onEnterFrame); dispatchEvent(new Event(Event.INIT)); } private function _onEnterFrame(e:Event = null):void { _capture.bitmapData.draw(_video); var detected:Boolean = false; try { detected = _detector.detectMarkerLite(_raster, 80) && _detector.getConfidence() > 0.5; } catch (e:Error) {} if (detected) { _detector.getTransformMatrix(_resultMat); _markerNode.setTransformMatrix(_resultMat); _markerNode.visible = true; } else { _markerNode.visible = false; } _renderer.render(); } private function _onInitRSS(e:Event = null):void { removeEventListener(Event.INIT, _onInitRSS); var rmv:RSSMatrixView = new RSSMatrixView(new Rectangle(0, 0, 600, 300)); rmv.addEventListener(Event.COMPLETE, function(e:Event):void { var mt:MovieMaterial = new MovieMaterial(rmv, false, true, true, new Rectangle(0, 0, 600, 300)); mt.doubleSided = true; var panel:Plane = new Plane(mt, 600, 300, 4, 4); panel.rotationZ = 90; panel.rotationX = 180; panel.scale = 0.5; _markerNode.addChild(panel); }); /* この部分に、任意のRSSフィードのURLを格納する */ rmv.load(new URLRequest("http://blog.tarotaro.org/feed")); } } }