java - 如何同时将 3 个旋转四元数相乘
问题描述
最近我在使用欧拉角旋转物体时遇到了万向节锁定问题。为了解决这个问题,我切换到四元数,但是我仍然遇到万向节锁定问题。这样做的原因是因为为了获得最终的旋转四元数,我必须将 3 个单独的旋转四元数(XYZ)相乘,但我能做到这一点的唯一方法是将它们中的 2 个相乘,然后将其乘积乘以第三个创建层次结构。
这是四元数乘法方法的代码-
public Quaternion multiply(Quaternion a, Quaternion b) {
return new Quaternion(a.w * b.x + a.x * b.w + a.y * b.z - a.z * b.y,
a.w * b.y - a.x * b.z + a.y * b.w + a.z * b.x,
a.w * b.z + a.x * b.y - a.y * b.x + a.z * b.w,
a.w * b.w - a.x * b.x - a.y * b.y - a.z * b.z);
}
这是我使用将所有 3 相乘的代码-
quaternionX = new Quaternion(new Vector3f(1, 0, 0), rotation.getX());
quaternionY = new Quaternion(new Vector3f(0, 1, 0), rotation.getY());
quaternionZ = new Quaternion(new Vector3f(0, 0, 1), rotation.getZ());
Quaternion matrix = new Quaternion(0, 0, 0, 0);
matrix = matrix.multiply(quaternionX, quaternionY);
matrix = matrix.multiply(matrix, quaternionZ);
有谁知道我如何同时将所有 3 个相乘?
解决方案
问题不在于您不能“同时”乘以三个四元数,而是您使用欧拉角作为旋转的初始表示,并且您(可能)通过操纵这些欧拉角来操纵旋转。
这是问题的根源,四元数或矩阵无法解决。因为,您现在所做的只是将欧拉角转换为四元数。问题就在于此。
要解决 Gimbal Lock 问题,您实际上需要做的是避免通过欧拉角表示和操纵您的旋转,而只需使用四元数或 3x3 矩阵。当您想要应用(增量)旋转时,您当前会增加/减少特定的欧拉角,您只需将增量旋转添加到您的四元数/矩阵。
另请参阅:https ://gamedev.stackexchange.com/questions/51410/how-to-avoid-gimbal-lock#answer-51418
推荐阅读
- php - 当添加新帖子时,laravel 5.6 向 10,000 多个订阅者发送邮件
- c# - 为什么要使用覆盖?
- sql-server - SQL Server 内存中 OLTP (Hekaton) 中的动态更新或等效脚本
- node.js - Angular 6+,能够从应用程序安全地创建用户
- ansible - 来自打包脚本的 Ansible 变量
- php - PHP 从 JSON 数组中获取值
- kubernetes - Rancher v2.0 提议 openebs 部署使用 v0.6.0 helm 模板
- javascript - 我的程序无法正常运行,当我单击“添加播放器”按钮时,没有文档添加到 mongo
- intellij-idea - intelliJ 将 Bootstrap 类显示为拼写错误
- java - 编辑jTable后如何将数据存入数组