このルービックキューブはPapervison3Dで作成しました。いくつかのリソースを使用して、27個のミニキューブ(3 * 3 * 3 = 27)を含むキューブを作成しました。マウスの移動時にルービックキューブを回転させることはすでに行われています。(私はカメラを回転させません。)
ルービックキューブのすべての動作はすでにそこにあります。しかし、私は最終段階で少し立ち往生しています。
通常のルービックキューブと同じように遊んでみると、問題なく動作しています。さらに、デフォルトのオイラー回転値はしばらくすると信頼できなくなります。必要なのは、ルービックキューブを選択した側に回転させ、その後、ルービックキューブをz軸上で回転させて、ミニキューブの面が上を向くようにすることです。TweenMaxでアニメートするのが好きですが、クォータニオン回転が必要なため、本当に行き詰まっています。
ルービックキューブ自体の選択された面を知っています。ルービックキューブのオイラー回転は、Matrix3D.matrix2euler(_rubiksCube.transform);
たとえば現在の回転がx: -20, y: 35, z: 10
であるときに選択した面に回転させる必要があることを知っています。ルービックキューブの背面を選択すると、回転する必要がありx:0, y: 180, z: 0
ます。
必要なのは、これをクォータニオン値に変更し、ルービックキューブを新しいクォータニオン値に回転させることです。その後、選択したミニキューブを上に向けるために、ルービックキューブをそのz軸上で回転させる必要があります。
これは、ルービックキューブをドラッグ/回転するときに使用するコードです。
private function onMouseMove( e : MouseEvent) : void {
var m : Matrix3D;
m = Matrix3D.rotationY( (mouseX - _mouseDownPoint.x) / 120 );
m = Matrix3D.multiply( m, Matrix3D.rotationX( -(mouseY - _mouseDownPoint.y) / 120 ));
_rubiksCube.transform = Matrix3D.multiply( m, _rubiksCube.transform );
_mouseDownPoint.x = mouseX;
_mouseDownPoint.y = mouseY;
}