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

标签 three.js rotation quaternions

我正在尝试为我的 Threejs 对象构建一个旋转 Controller 。我的旋转方法如下:

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

我需要这样做,以便围绕世界轴而不是局部轴旋转(与 this 帖子相关 -> 由于我描述的问题 here ,我也无法在这里使用欧拉旋转成员)

解决我的问题:

我制作了 this JSFiddle ,它很好地显示了这个问题。

如何重新创建:

1)打开 fiddle 链接。

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

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

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

我的问题是:

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

最佳答案

发生这种情况的原因是因为您需要将“纯”旋转矩阵提供给 Quaternion.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();
}

关于three.js - 使用四元数进行旋转会使我的对象以特定角度缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56670782/

相关文章:

math - 围绕 x,y,z 轴旋转模型,无万向节锁定,输入数据始终为 x,y,z 轴角度旋转

java - 根据两点匹配图像

java - 按给定四元数旋转单位 vector

c# - Unity3d - eulerAngles(局部和全局)与检查器中的完全不同

javascript - Vertex 和 Vector3 在 Three.js 中不可互换

javascript - JQuery Draggable 中的三个 JS ObitControl

javascript - 在 Three.js 上渲染重型模型/网格

php - 从 iOS 应用程序错误旋转上传的图像

rotation - 如何获得 object3D 所面向方向的归一化向量?

ios - 三.JS模型查看器在phonegap中可行吗?