这是事情。我有一个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()方法,但不知道该怎么做,因为我需要旋转整个对象,不只是一个孩子。有人可以带我到正确的方向去吗?满足我需求的最佳方式是什么?
答案 0 :(得分:0)
THREE.Quaterion对象包含插值方法。因此,计算原始面法线的四元数值,即从setFromRotationMatrix(ma)到达此处的四元数,然后重复应用THREE.Quaterion.slerp()以获取中间值,这可以应用于cube.quaternion