0

事情就是这样。我有一个 Object3d,它由 6 个平面组成,形成一个立方体。现在,在基于鼠标输入应用四元数旋转之后并且在立方体停止之后 - 我需要立方体在其最近的一侧(平面子)直接转向相机。我现在正在做的是获取我的 Object3d 矩阵的当前欧拉角,对这个矩阵应用旋转并使用 setFromRotationMatrix() 函数将其设置回我的对象​​的四元数。有时这种方法有效(通常在低角度),有时 Z 轴的行为是错误的(或者可能是 Y,甚至所有这些都无法分辨)。

现在,我当然可以计算最近的一侧并将这一侧的直接四元数应用于我的对象,这可行,但这没有给我动画。

我正在使用此代码来获取我当前的角度:http ://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q37 。基于此,我计算每个轴最接近的 90 度旋转:

        function lookAtCamDeg(val){
            var d = 1;
            var s = 1;
            var newAngle;

            if(val < 0)d*=-1;

            val = Math.abs(val);

            if(val <= 45)s*=-1;
            if(val > 45)val=90-val;

            newAngle = val*d*s;

            return newAngle;
        }

并应用它来转动我的立方体:

            var angles = getAngles();http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q37
            var newX = lookAtCamDeg(angles.x);
            var newY = lookAtCamDeg(angles.y);
            var newZ = lookAtCamDeg(angles.z);

            var ma = cube.matrix;
            ma = ma.rotateX(-newX*DEGREES)
            ma = ma.rotateY(-newY*DEGREES)
            ma = ma.rotateZ(-newZ*DEGREES)
            cube.quaternion.setFromRotationMatrix(ma);

我现在想的是尝试使用我的立方体(子)的单独平面并根据它们的法线应用lookAt()方法,但不知道该怎么做,因为我需要旋转整个对象,而不仅仅是一个孩子。有人可以引导我走向正确的方向吗?满足我的需求的最佳方式是什么?

4

1 回答 1

0

THREE.Quaterion 对象包含插值方法。所以计算原始人脸法线的四元数,你从setFromRotationMatrix(ma)这里得到的四元数,然后反复应用THREE.Quaterion.slerp()得到in-betweens,可以应用到cube.quaternion

于 2012-12-04T20:36:00.193 回答