FLARToolKitのアプリケーションは、マーカーを認識して検出した傾きと位置を、毎フレーム3Dモデルに反映する仕組みでAR表現を実現しています。 モデルの本体はPapervision3DのScene3DObjectにぶら下がっているFLARBaseNodeクラス(DisplayObject3Dのサブクラス)のインスタンスで、与えられた傾きをsetTransformMatrixというメソッドでFLARBaseNodeのtransformへ反映しています。

このときにsetTransformMatrixではtransform(Matrix3D)の各要素を直接アップデートしているため、表示は変わるのですがrotationXなどのプロパティの値は反映されていません。

ですので、マーカー認識の支配下からはずした状態でTweenerとかでrotationXを変更したときに、回転の開始角が常に0-Nになってしまって困りました。

Tweenerに渡す前に、DisplayObject3D.transformの値から回転角を算出してrotation系のプロパティを手動で反映してやる必要があります。

具体的には、Matrix3D.matrix2euler( matrix3d:Matrix3D ):Number3D を利用して、transformプロパティの値を角度に変換し、それを各軸のrotationに代入します。

//ARの傾きの反映を止めている状態です。 var transform:Matrix3D = _baseNode.transform; var rot:Number3D = Matrix3D.matrix2euler( transform ); baseNode.rotationX= rot.x; baseNode.rotationY= rot.y; baseNode.rotationZ= rot.z; Tweener.addTween( _baseNode, { rotationX: 100, rotationY: 0, rotationZ: 180, time:2 } );

これはSaqooshaさんとpsyarkさんに教えてもらいました。ありがとうございます。

なおeuler(オイラー)角っていうのは物理学者のオイラーによって考案された表現で、(X,Y,Z)の各軸の回転角を表現します。

HTML5飯