ルービックキューブを作っていてハマった箇所についての自分メモ。
09/09/17 時点で、Papervision3D_2.1.920.swc では org.papervision3d.objects.primitives.* のプリミティブに対して直接回転をかけるメソッドやプロパティが全部オイラー角仕様になっている。
なので、
obj.rotationX += rotDeg;
とか、
obj.transform.calculateMultiply(obj.transform, Matrix3D.rotationY(rotDeg * Math.PI / 180));
とかみたいに回転をかけようとしても、ジンバルロックが起きて自由自在に操作ができない。
これは、org.papervision3d.core.math.Quaternion のクォータニオンを使えば回避できる。
でも、内部的に Quaternion を使って一発で座標変換をしてくれる関数は org.papervision3d.core.math.Matrix3D にはまだ実装されていない様子。
操作自体は数行で簡単に書けるから、下みたいな関数をひとつ作っておけば、後はもう思った通りに動いてくれる。
//任意軸回りの回転 (x, y, z 軸回転角[°], org.papervision3d.objects.primitives.* の回転対象)
public static function rotate3D(degX:Number, degY:Number, degZ:Number, obj:Cube):void {
var pos1:Quaternion = Quaternion.createFromMatrix(obj.transform);
var pos2:Quaternion = Quaternion.createFromEuler(degX, degY, degZ, true);
pos2.normalize();
pos2.mult(pos1);
pos2.normalize();
obj.copyTransform(Matrix3D.quaternion2matrix(pos2.x, pos2.y, pos2.z, pos2.w));
}
しかし、この点を差し引いても、Flash でこんなに 3D 表現ができるのは十分すごい。
ちなみに、クォータニオンを使わないで、オイラー角で間違えちゃった場合はこんなことになる。
↓画像クリックで動きます
AS3ソースはこちら
でも、これはこれで見てて楽しいかもしれない。
そういえば WiiFlash 0.4.5 でもまだ Wii MotionPlus には未対応。
現在、WiimoteLib v1.8 のベータ版ではジャイロセンサの生データだけが取得できる。
どれもこれも、バージョンアップが待ち遠しいですたい。