加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – 四元数立方体旋转动画

发布时间:2020-12-15 07:29:52 所属栏目:百科 来源:网络整理
导读:我用Papervison3D创建了这个Rubiks Cube.通过一些资源,我创建了一个内部有27个微型管的立方体(3 * 3 * 3 = 27).在鼠标移动时旋转Rubiks立方体已经完成. (我不旋转相机.) Rubiks Cube的所有行为都已存在.但是我在最后阶段有点陷入困境. 当我使用它时,就像我使
我用Papervison3D创建了这个Rubiks Cube.通过一些资源,我创建了一个内部有27个微型管的立方体(3 * 3 * 3 = 27).在鼠标移动时旋转Rubiks立方体已经完成. (我不旋转相机.)

Rubiks Cube的所有行为都已存在.但是我在最后阶段有点陷入困境.

当我使用它时,就像我使用普通的Rubiks Cube一样,它工作正常,此外我知道默认的Euler旋转值在一段时间后不再可靠.我需要的是将Rubiks立方体旋转到选定的一侧,然后在Z轴上旋转Rubiks立方体,使小型立面朝上.我更喜欢使用TweenMax为它设置动画,但我真的被卡住,因为我需要四元数旋转.

我知道Rubiks Cube本身的精选面孔.我知道使用Matrix3D.matrix2euler(_rubiksCube.transform)的Rubiks Cube的Euler旋转;我需要的是将它旋转到选定的面,例如当前旋转为x:-20,y:35,z:10时,我选择rubiksCube的背面,它必须旋转到x:0,y:180,z:0.

我需要的是将其更改为四元数值并将Rubiks多维数据集旋转到新的四元数值.之后,必须将Rubiks立方体旋转到其z轴上,使其朝向所选的微型管面朝上.

这是我在拖动/旋转Rubiks Cube时使用的代码

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()获取当前的euler位置并转换为四元数.
>获取目标四元数.
>使用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;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读