Three.js 使用四元数进行旋转会使对象以特定角度缩放

Three.js 使用四元数进行旋转会使对象以特定角度缩放,three.js,rotation,quaternions,Three.js,Rotation,Quaternions,我正在尝试为我的threejs对象构建一个旋转控制器。我的轮换方法如下: function rotate(axis, angle) { rotMat = new THREE.Matrix4().makeRotationAxis(axis, angle); rotMat.multiply(mesh.matrix); rotQuat = new THREE.Quaternion().setFromRotationMatrix(rotMat); mesh.quatern

我正在尝试为我的threejs对象构建一个旋转控制器。我的轮换方法如下:

function rotate(axis, angle) {
    rotMat = new THREE.Matrix4().makeRotationAxis(axis, angle);
    rotMat.multiply(mesh.matrix);
    rotQuat = new THREE.Quaternion().setFromRotationMatrix(rotMat);
    mesh.quaternion.copy(rotQuat);
    mesh.updateMatrix();
}
我需要这样做,以便围绕世界轴而不是局部轴进行旋转(与post->相关,由于我描述的一个问题,我也不能在这里使用Euler旋转成员)

解决我的问题:

我制作了JSFiddle,这表明这个问题非常好

如何重新创建:

1) 打开小提琴链接

2) 按键盘上的X、Y或Z键进入所需轴的旋转模式

3) 按住“向上箭头”键并旋转,直到出现“奇怪”缩放。应该以90-100度的角度发生。请注意,如果继续旋转,缩放将继续

还请注意,当到达特定角度区域时,我减小了旋转步长(旋转速度)。仅当旋转步长非常小时才会发生缩放

我的问题是:


有人知道为什么旋转会导致缩放吗?

发生这种情况的原因是因为需要将“纯”旋转矩阵输入到四元数。setFromRotationMatrix方法。因此,将“旋转”功能更改为以下功能将起作用:

function rotate (axis, angle) {
  rotMat = new THREE.Matrix4().makeRotationAxis(axis, angle);
  rotMat.multiply(mesh.matrix);
  var rotMat2 = new THREE.Matrix4().extractRotation(rotMat);
  rotQuat = new THREE.Quaternion().setFromRotationMatrix(rotMat2);
  mesh.quaternion.copy(rotQuat);
  mesh.updateMatrix();
}