FLARToolKit スタートガイドのスクリプトを参考にして、
FLARToolkit + WOWEngine って感じで、箱の中をボールが転がるやつを作ってみました。
マーカー
Corocoro.swf
Corocoro.as
めんどくさいから、動画はなし。
ソースコードの一部だけど、試行錯誤したらこんな感じなってしまった。
座標の変換はもう少しお洒落に書けるんじゃないの?という気がする。
行列の計算とかよく分かってないし。
ACTIONSCRIPT:
-
private function _onEnterFrame(e:Event = null):void {
-
this._capture.bitmapData.draw(this._video);
-
if (this._detector.detectMarkerLite(this._raster, 80) && this._detector.getConfidence()> 0.5) {
-
-
this._detector.getTransformMatrix(this._resultMat);
-
this._baseNode.setTransformMatrix(this._resultMat);
-
-
_rot = Matrix3D.matrix2euler(this._baseNode.transform,_rot);
-
-
var rotz:Number = (int(_rot.z) - 180);
-
_ba.setRotation(0,0,rotz);
-
_wow.step();
-
-
var angle:Number = (-1 * rotz) * Math.PI / 180;
-
// var angle:Number = (1 * rotz) * Math.PI / 180;
-
var cos:Number = Math.cos(angle);
-
var sin:Number = Math.sin(angle);
-
-
_sphere.x = -(_particle.px * cos - _particle.py * sin) ;
-
_sphere.y = _particle.py * cos + _particle.px * sin ;
-
_sphere.z = _particle.pz;
-
-
this._baseNode.visible = true;
-
} else {
-
this._baseNode.visible = false;
-
}
-
-
this._renderer.render();
-
-
}
ってかね、WBoundAreaをぐるぐる回して、その結果から座標軸を算出するよりは、
WOWEngineのaddMasslessForceってところの重力定義を随時変更できれば楽なんだけどね。。。
いや、そうじゃなくて、WPlane で箱を作って、それを回せば、こんな無茶苦茶な計算は不要なのか、今気がついた。
何はともあれ、WOWEngineはぼちぼちver2が出るのだろうけど、もう少し枯れてきて欲しいとは思う。
といいますか、FLARToolkit + WOWEngine ネタだと、
Saqoosha.net::Adobe MAX 2009で公開されている ClothSimuDemo.as のソースコードのほうが分かりやすいよなぁ。。。
こっち見て作ればよかった。
ACTIONSCRIPT:
-
private function _onPreRender(e:Event):void {
-
if (checkInterrupted()) {
-
return;
-
}
-
for each (var v:Vertex in this._edge) {
-
var p:WSphere = WSphere(v.extra.physics);
-
var vi:Vertex = Vertex(v.extra.init);
-
this.multiplyVertex(this._ctx.arview.marker.transform, vi, this._tmp);
-
p.px = this._tmp.x;
-
p.py = this._tmp.y;
-
p.pz = this._tmp.z;
-
}
-
this._wow.step();
-
this._cloth.update();
-
this._cloth.updateNormal();
-
event(this._ctx.renderThread, RenderThread.PRE_RENDER, this._onPreRender);
-
interrupted(this._cleanup);
-
}
-
-
private function multiplyVertex(m:Matrix3D, vi:Vertex, vo:Vertex):Vertex {
-
var vx:Number = vi.x;
-
var vy:Number = vi.y;
-
var vz:Number = vi.z;
-
vo.x = vx * m.sxx + vy * m.sxy + vz * m.sxz + m.tx;
-
vo.y = vx * m.syx + vy * m.syy + vz * m.syz + m.ty;
-
vo.z = vx * m.szx + vy * m.szy + vz * m.szz + m.tz;
-
return vo;
-
}