Я создал этот кубик Рубика с помощью Papervison3D. С некоторыми ресурсами я создал куб с 27 миникубиками внутри (3 * 3 * 3 = 27). Вращение кубика Рубика при движении мыши уже выполнено. (Я не поворачиваю камеру.)
Здесь уже заложено все поведение кубика Рубика. Но я немного застрял на заключительном этапе.
Когда я играю с ним, как с обычным кубиком Рубика, он работает нормально, к тому же я знаю, что значения вращения Эйлера по умолчанию через некоторое время перестают быть надежными. Мне нужно повернуть кубик Рубика на выбранную сторону, а после этого повернуть кубик Рубика по оси z так, чтобы грань мини-куба была обращена вверх. Я предпочитаю анимировать его с помощью TweenMax, но я действительно застрял, так как мне нужны вращения кватернионов.
Я знаю выбранную грань самого кубика Рубика. Я знаю вращение Эйлера куба Рубика с помощью Matrix3D.matrix2euler(_rubiksCube.transform);
. Мне нужно повернуть его к выбранной грани, например, когда текущее вращение равно x: -20, y: 35, z: 10
, и я выбираю заднюю грань кубика Рубика, он должен повернуться на x:0, y: 180, z: 0
.
Мне нужно изменить это на значения Quaternion и повернуть кубик Рубика на новое значение Quaternion. После этого он должен повернуть кубик Рубика по оси 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;
}