three.js - 使用四元数进行旋转会导致我的对象以特定角度缩放
问题描述
我正在尝试为我的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();
}
我需要这样做才能围绕世界轴而不是局部轴旋转(与这篇文章有关->由于我在此处描述的问题,我也无法在此处使用欧拉旋转成员)
解决我的问题:
我制作了这个JSFiddle,它很好地显示了这个问题。
如何重新创建:
1)打开小提琴链接。
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();
}
推荐阅读
- elixir - 如何在 Ecto 迁移的执行语句中插入 Elixir 列表?
- django - 在 Django 的模板标签中无法访问用户变量
- python-3.x - Python Mqtt client.loop_forever 如何跳转n行
- angular - Angular 中未显示的属性
- deep-learning - 输入张量和隐藏张量不在同一个设备上,发现输入张量在 cuda:0 和隐藏张量在 cpu
- c# - DataTable:如果是 Db 中的 Date 字段,则在 UI 上仅显示 date 而不是 datetime
- reactjs - 如何通过索引从对象中推断元素?
- r - 如何在R中提取带有特殊字符的模式之间的字符串
- chef-infra - Powershell_Script with Guard Interpreter -> Action RUN everytime
- json - Django 嵌套文档序列化程序问题