iPhoneで表示したGAPのロゴをマーカーとして使うAR
iPhoneで表示したGAPのロゴをマーカーとして使うAR
iPhone(アンドロイドでもなんでもいいけど)で
「GAP logo」でイメージ検索。
↓
(たぶん)二番目に出てくる、余白のついているロゴを表示。
↓
おちついてカメラに向けると、うまくいく、かも。
マーカーの登録はここで、画面に映したロゴで行った。
http://flash.tarotaro.org/ar/MarkerGeneratorOnline.html
つまりなんも印刷してない。エコAR
/**
* Copyright umhr ( http://wonderfl.net/user/umhr )
* GNU General Public License, v3 ( http://www.gnu.org/licenses/quick-guide-gplv3.html )
* Downloaded from: http://wonderfl.net/c/cxHZ
*/
/*
iPhoneで表示したGAPのロゴをマーカーとして使うAR
iPhone(アンドロイドでもなんでもいいけど)で
「GAP logo」でイメージ検索。
↓
(たぶん)二番目に出てくる、余白のついているロゴを表示。
↓
おちついてカメラに向けると、うまくいく、かも。
マーカーの登録はここで、画面に映したロゴで行った。
http://flash.tarotaro.org/ar/MarkerGeneratorOnline.html
つまりなんも印刷してない。エコAR
*/
// forked from nutsu's FLARToolKit use flash.geom package test
// forked from mash's FLARToolKit SimpleCube sample
// from flartoolkit SimpleCube example
// print this marker: http://saqoosha.net/lab/FLARToolKit/flarlogo-marker.pdf
//flash.geom.* でFLAR使うテスト。あってるかな、、
//座標系まちごうとったから変えた
package
{
import flash.display.Graphics;
import flash.display.Shape;
import flash.display.Sprite;
import flash.events.Event;
import flash.geom.Matrix3D;
import flash.geom.Utils3D;
import org.libspark.flartoolkit.core.FLARMat;
import org.libspark.flartoolkit.core.param.FLARParam;
import org.libspark.flartoolkit.core.transmat.FLARTransMatResult;
import org.libspark.flartoolkit.core.types.FLARIntSize;
import org.libspark.flartoolkit.example.ARAppBase;
[SWF( width=465, height=465, frameRate=30, backgroundColor=0 )]
public class Main extends ARAppBase
{
private var _base:Sprite;
private var _view:Shape;
private var g:Graphics;
//
private var _rmat:FLARTransMatResult = new FLARTransMatResult();
private var _fr_mat:Matrix3D;
private var _de_mat:Matrix3D;
//
private var _mat:Matrix3D;
private var vert1:Vector.<Number>;
private var uvt1:Vector.<Number>;
private var vert2:Vector.<Number>;
private var uvt2:Vector.<Number>;
private var vout:Vector.<Number>;
//
private var projmat:Matrix3D;
public function Main()
{
Wonderfl.capture_delay( 5 );
addEventListener(Event.INIT, _onInit);
//init('http://assets.wonderfl.net/static/flar/camera_para.dat', 'http://assets.wonderfl.net/static/flar/flarlogo.pat');
init('http://assets.wonderfl.net/static/flar/camera_para.dat', 'http://www.mztm.jp/wonderfl/gap.pat');
}
private function _onInit(e:Event):void
{
addChild( _base = new Sprite() );
//
_capture.width = 640;
_capture.height = 480;
_base.addChild(_capture);
//
g = Shape(addChild( _view = new Shape() )).graphics;
_view.x = 320;
_view.y = 240;
_view.scaleX = _view.scaleY = 2;
//
_fr_mat = new Matrix3D();
_de_mat = new Matrix3D();
initCamera( this._param );
//
projmat = new Matrix3D();
initARObjects();
//
stage.addEventListener(Event.ENTER_FRAME, _onEnterFrame);
}
private function initARObjects():void
{
// Create Plane with same size of the marker.
vert1 = new Vector.<Number>();
uvt1 = new Vector.<Number>();
var w:Number = 40;
vert1.push( 0, 0, 0,
-w, -w, 0, w, -w, 0, w, w, 0, -w, w, 0,
w, 0, 0, 0, w, 0, 0, 0, w );
for ( var i:int = 0; i < vert1.length; i++ ) {
uvt1.push( 0 );
}
//cube
vert2 = new Vector.<Number>();
uvt2 = new Vector.<Number>();
w /= 2;
vert2.push( -w, -w, -w, w, -w, -w, w, w, -w, -w, w, -w,
-w, -w, w, w, -w, w, w, w, w, -w, w, w );
for ( i = 0; i < vert1.length; i++ ) {
uvt1.push( 0 );
}
//
_mat = new Matrix3D();
//
vout = new Vector.<Number>();
}
private function drawObjects():void
{
g.clear();
vout.length = 0;
Utils3D.projectVectors( projmat, vert1, vout, uvt1 );
g.lineStyle( 2, 0xffffff );
g.beginFill( 0xff0000, 0.2 );
quad( vout[2], vout[3], vout[4], vout[5], vout[6], vout[7], vout[8], vout[9] );
g.endFill();
//x axis
g.lineStyle( 2, 0xff0000 );
line( vout[0], vout[1], vout[10], vout[11] );
//y axis
g.lineStyle( 2, 0x0000ff );
line( vout[0], vout[1], vout[12], vout[13] );
//z axis
g.lineStyle( 2, 0x00ff00 );
line( vout[0], vout[1], vout[14], vout[15] );
//cube
_mat.identity();
_mat.appendTranslation( 0, 0, 20 );
var vert2t:Vector.<Number> = new Vector.<Number>();
_mat.transformVectors( vert2, vert2t );
vout.length = 0;
Utils3D.projectVectors( projmat, vert2t, vout, uvt2 );
g.lineStyle( 1, 0xffffff );
quad( vout[0], vout[1], vout[2], vout[3], vout[4], vout[5], vout[6], vout[7] );
quad( vout[8], vout[9], vout[10], vout[11], vout[12], vout[13], vout[14], vout[15] );
line( vout[0], vout[1], vout[8], vout[9] );
line( vout[2], vout[3], vout[10], vout[11] );
line( vout[4], vout[5], vout[12], vout[13] );
line( vout[6], vout[7], vout[14], vout[15] );
}
private function line( x0:Number, y0:Number, x1:Number, y1:Number ):void
{
g.moveTo( x0, y0 );
g.lineTo( x1, y1 );
}
private function quad( x0:Number, y0:Number, x1:Number, y1:Number, x2:Number, y2:Number, x3:Number, y3:Number ):void
{
g.moveTo( x0, y0 );
g.lineTo( x1, y1 );
g.lineTo( x2, y2 );
g.lineTo( x3, y3 );
g.lineTo( x0, y0 );
}
private function _onEnterFrame(e:Event):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(_rmat);
_de_mat.rawData = Vector.<Number>(
[ _rmat.m00, _rmat.m10, _rmat.m20, 0,
_rmat.m01, _rmat.m11, _rmat.m21, 0,
_rmat.m02, _rmat.m12, _rmat.m22, 0,
_rmat.m03, _rmat.m13, _rmat.m23, 1 ]
);
projmat.rawData = Vector.<Number>([0,1,0,0, 1,0,0,0, 0,0,1,0, 0,0,0,1]);
projmat.append( _de_mat );
projmat.append( _fr_mat );
drawObjects();
_view.visible = true;
} else {
_view.visible = false;
}
}
//無駄あったから整理した
private function initCamera( param:FLARParam ):void
{
var size:FLARIntSize = param.getScreenSize();
var width:int = size.w;
var height:int = size.h;
var tMat:FLARMat = new FLARMat (3, 4);
var iMat:FLARMat = new FLARMat (3, 4);
param.getPerspectiveProjectionMatrix().decompMat(iMat, tMat);
var icpara:Array = iMat.getArray();
for (var i:int = 0; i < 4; i++) {
icpara[1][i] = (height - 1) * (icpara[2][i]) - icpara[1][i];
}
var w:Number = icpara[0][0] / icpara[2][2];
var h:Number = -icpara[1][1] / icpara[2][2];
_fr_mat.rawData = Vector.<Number>(
[ w, 0, 0, 0,
0, h, 0, 0,
0, 0, 1, 1,
0, 0, 0, 0 ]
);
}
}
}