四元数多维数据集旋转动画

我用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以来已经有一段时间了,但它是这样的:

  • 将欧拉角存储在单独的变量中(例如,u,v,w)。 在计算中累积这些变量。
  • 使用Quaternion.createFromEuler()创建一个四元数;
  • 使用quaternion.matrix进行转换
  • 例如:

    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;
    }
    

    更新:啊,我再次读你的问题。 这听起来像你想从目前的方向平滑内插到新的方向。 这之前对我有效的是:

  • 获取当前的欧拉位置并使用Quaternion.createFromEuler()将其转换为四元数。
  • 获取目标四元数。
  • 使用quaternion.slerp()从源四元数到目标的一段时间内插。
  • 例如:

    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

    上一篇: Quaternion cube rotation animation

    下一篇: Convert Quaternion rotation to rotation matrix?