四元数多维数据集旋转动画
我用Papervison3D创建了这个Rubiks立方体。 有了一些资源,我创建了一个27个微型立方体(3 * 3 * 3 = 27)的立方体。 鼠标移动Rubiks立方体已经完成。 (我不旋转相机。)
Rubiks Cube的所有行为都已经在那里了。 但我在最后阶段有点卡住了。
当我像使用普通Rubiks立方体一样使用它时,它运行正常,除此之外,我知道默认的欧拉旋转值在一段时间后不再可靠。 我需要的是将Rubiks立方体旋转到选定的一侧,然后将Rubiks立方体旋转到Z轴上,使微型立方体面朝上。 我更喜欢用TweenMax制作动画,但由于我需要四元数旋转,所以我真的陷入困境。
我知道Rubiks Cube本身的选择面。 我知道使用Matrix3D.matrix2euler(_rubiksCube.transform);
的Rubiks立方体的欧拉旋转Matrix3D.matrix2euler(_rubiksCube.transform);
我需要的是将它旋转到选定的面,例如当前旋转为x: -20, y: 35, z: 10
,我选择rubiksCube的背面,它必须旋转到x:0, y: 180, z: 0
。
我需要的是将其更改为四元数值,并将Rubiks立方体旋转为新的四元数值。 之后,它必须旋转Rubiks立方体在其z轴上面朝上面向选定的微型立方体。
这是拖动/旋转Rubiks立方体时使用的代码
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;
}
四元数绝对是要走的路。 自从我使用PV3D以来已经有一段时间了,但它是这样的:
例如:
var yRotation:Number = 0;
var xRotation:Number = 0;
function mouseHandler(e:MouseEvent):void {
yRotation += (mouseX - _mouseDownPoint.x) / 120;
xRotation += -(mouseY - _mouseDownPoint.y) / 120);
var q:Quaternion = Quaternion.createFromEuler(xRotation, yRotation, zRotation, true);
_rubiksCube.transform = q.matrix;
_mouseDownPoint.x = mouseX;
_mouseDownPoint.y = mouseY;
}
更新:啊,我再次读你的问题。 这听起来像你想从目前的方向平滑内插到新的方向。 这之前对我有效的是:
例如:
function clickHandler(e:MouseEvent):void {
qSource = qCurrent;
qTarget = quaternion.createFromEuler(....);
t = getTimer();
}
function frameHandler(e:Event):void {
if (isAnimating) {
tDelta = (getTimer() - t) / 10000; // 10000 = 10 seconds
qCurrent = slerp(qSource, qTarget, tDelta);
_rubiksCube.transform = qCurrent.matrix;
}
}
链接地址: http://www.djcxy.com/p/81847.html