Анимация вращения куба кватерниона

Я создал этот кубик Рубика с помощью 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;
}
6
задан Bill the Lizard 13 May 2011 в 13:19
поделиться