FLARToolkit + WOWEngineとか

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();

    }

[/actionscript]

ってかね、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;
    }

[/actionscript]