java - 将四元数从当前旋转角度旋转一定角度的正确方法是什么?
问题描述
我正在尝试使用来自 JOML 的四元数来使用四元数旋转:https ://github.com/JOML-CI/JOML/blob/main/src/org/joml/Quaternionf.java 。
我可以让物体旋转,但它们被卡住并且无法完成完整的旋转。每一帧都会更新对象。
编辑:删除了所有与欧拉相关的代码,我只是试图让对象基于某个角度在单个轴上旋转。
编辑2:我正在尝试使用共轭并将四元数相乘,就像我在一些视频中看到的那样。我并不完全在那里,因为模型出于某种原因将自己从屏幕上旋转了下来。
编辑 3:标准化四元数修复了消失的行为。问题似乎是没有简单的方法来旋转一定的量,而没有一个计时器来处理这在我的情况下不起作用,因为我试图旋转一个没有设置开始和结束的任意量的对象。
旋转功能
public void rotate(float angle, float x, float y, float z) {
Quaternionf rot = new Quaternionf();
rot.rotateAxis((float) Math.toRadians(angle), x, y, z);
Quaternionf conjugate = rot.conjugate();
rotation = rot.mul(rotation).mul(conjugate);
}
调用旋转函数
entity.transform.rotate( 1,0,1, 0);
解决方案
将欧拉角转换为矩阵或四元数或任何表示都没有关系:只要您使用欧拉角表示方向,Gimbal Lock 是不可避免的。
因此,为了避免万向节锁定的发生,您必须放弃使用欧拉角并保持一个方向表示(如 3x3 矩阵或四元数)并对它们应用增量更改,而不是尝试将完整方向表示为三个欧拉角。因此,每当您 - 比方说 - 将对象围绕某个轴旋转几度时,您就会将该增量变化或方向应用于矩阵/四元数。
推荐阅读
- python - 备份脚本不会遍历文件夹中的文件
- apache-spark - Play Cassandra Netty Server null pointer exception
- python - Why do I need a shell script to run a python script inside the container?
- webforms - 在 WebForms 中使用 Open ID 或 Identity Server4 进行单点登录
- swift - 返回从 HTTP 请求中检索到的值的方法
- ansible - Ansible command using variable input fails to execute
- angular - 如何防止任何键盘事件及其对Angular 6中元素的默认行为
- python - 网络抓取不断更新 Python 中的数据
- java - Java Mail 下载大型 IMAP 邮件
- r - 在绘图中标记特定点