这个四元数旋转代码是如何工作的?

2023-11-22

我试图了解四元数旋转是如何工作的,我找到了这个迷你教程http://www.julapy.com/blog/2008/12/22/quaternion-rotation/但他做出了一些我无法锻炼的假设,比如我该怎么做”只需绕轴旋转矢量即可计算出绕每个轴的旋转矢量。“他如何计算angleDegreesX、angleDegreesY和angleDegreesZ?

有人可以提供一个可行的示例或解释吗?


最简短的总结是四元数只是旋转矩阵的简写。 4x4 矩阵需要 16 个单独的值,而四元数可以用 4 表示完全相同的旋转。

对于数学爱好者来说,我完全意识到上面的内容过于简单化了。

为了提供更多细节,让我们参考维基百科文章:

单位四元数提供了方便 表示的数学符号 物体的方向和旋转 在三个维度上。与欧拉相比 它们的角度更容易组合并且 避免万向节锁问题。 与旋转矩阵相比,它们是 数值更稳定并且可能 更高效

从开头的段落中还不清楚的是,四元数不仅方便,而且是唯一的。如果一个对象有一个特定的方向,在任意数量的轴上扭曲,则存在一个唯一的四元数来表示该方向。

再次,对于数学倾向的人,我上面的独特性评论假设右手旋转。存在一个等效的左手四元数,它绕相反的轴以相反的方向旋转。

为了简单解释,这是有区别的,没有区别。

如果您想制作一个表示绕轴旋转的简单四元数,可以通过以下一系列简短步骤来实现:

  1. 选择你的旋转轴v = {x, y, z}。出于礼貌,请选择一个单位向量:如果它的长度还不是 1,请将所有分量除以 v 的长度。
  2. 选择您想要围绕该轴转动的旋转角度并将其命名为theta.
  3. 可以使用下面的示例代码计算等效单位四元数:

四元数构造:

q = { cos(theta/2.0),     // This is the angle component 
      sin(theta/2.0) * x, // Remember, angle is in radians, not degrees!
      sin(theta/2.0) * y, // These capture the axis of rotation
      sin(theta/2.0) * z};

请注意这些除以二的操作:这确保了轮换中不会出现混乱。对于普通旋转矩阵,向右旋转 90 度与向左旋转 270 度相同。相当于这两种旋转的四元数是不同的:您不能将其中一个与另一个混淆。

编辑:回答评论中的问题:

让我们通过设置以下参考系来简化问题:

  1. 选择屏幕中心作为原点(我们将围绕该中心旋转)。
  2. X轴指向右侧
  3. Y 轴指向上方(屏幕顶部)
  4. Z 轴指向屏幕外的您的脸部(形成一个漂亮的右手坐标系)。

因此,如果我们有一个示例对象(例如箭头),它首先指向右侧(正 x 轴)。如果我们将鼠标从 x 轴向上移动,鼠标将为我们提供正 x 和正 y。因此,完成一系列步骤:

double theta = Math.atan2(y, x);
// Remember, Z axis = {0, 0, 1};
// pseudo code for the quaternion:
q = { cos(theta/2.0),     // This is the angle component 
      sin(theta/2.0) * 0, // As you can see, the zero components are ignored
      sin(theta/2.0) * 0, // Left them in for clarity.
      sin(theta/2.0) * 1.0};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个四元数旋转代码是如何工作的? 的相关文章

  • 无法解析类型为 xxx 的任何 bean;限定符:[@javax.enterprise.inject.Any()]

    我有一个 LoginProvider 接口 public interface LoginProvider boolean login String username String password 以及两种不同的实现 public clas
  • 使用 GWT CellTableBuilder 构建树表

    Is it possible to build a tree table like this http www sencha com examples ExamplePlace basictreegrid with the new Cell
  • “_加载小部件时出现问题”消息

    加载小部件时 如果找不到资源或其他内容 则会显示 加载小部件时出现问题 就这样 惊人的 此消息保留在主屏幕上 甚至没有说明加载时遇到问题的小部件 我通过反复试验弄清楚了这一点 但我想知道发生这种情况时是否有任何地方可以找到错误消息 Andr
  • Android 2.2 SDK - Droid X 相机活动无法正常完成

    我注意到我在 Droid X 上调用的默认相机活动与我的 Droid 和 Nexus One 上的默认相机活动看起来不同 在 Droid 和 Nexus One 上选择 确定 后 活动将完成 Droid X 有一个 完成 按钮 它将带您返回
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • Java:使用 HttpURLConnection 的 HTTP PUT

    如何执行 HTTP PUT 我正在使用的类似乎认为它正在执行 PUT 但端点将其视为我执行了 GET 我做错了什么吗 URL url new URL https HttpURLConnection conn HttpURLConnectio
  • 使用 RecyclerView 适配器在运行时更改布局屏幕

    我有两个布局文件 如下所示 如果列表中存在数据 则我显示此布局 当列表为空时 我会显示此布局 现在我想在运行时更改布局 当用户从列表中删除最后一项时 我想将布局更改为第二张图片中显示的 空购物车布局 In getItemCount Recy
  • 内存一致性 - Java 中的happens-before关系[重复]

    这个问题在这里已经有答案了 在阅读有关内存一致性错误的 Java 文档时 我发现与创建 发生 之前 关系的两个操作相关的点 当语句调用时Thread start 每个具有 与该语句发生之前的关系也有一个 与 new 执行的每个语句之间发生的
  • Git 无法识别重命名和修改的包文件

    我有一个名为的java文件package old myfile java 我已经通过 git 提交了这个文件 然后我将我的包重命名为new所以我的文件在package new myfile java 我现在想将此文件重命名 和内容更改 提交
  • Java 数组的最大维数

    出于好奇 在 Java 中数组可以有多少维 爪哇language不限制维数 但是JavaVM规范将维度数限制为 255 例如 以下代码将无法编译 class Main public static void main String args
  • 计算日期之间的天数差异

    在我的代码中 日期之间的差异是错误的 因为它应该是 38 天而不是 8 天 我该如何修复 package random04diferencadata import java text ParseException import java t
  • Java 收集返回顶级项目的映射的嵌套流

    我有以下模型 class Item String name List
  • Java - 返回值是否会中断循环?

    我正在编写一些基本上遵循以下格式的代码 public static boolean isIncluded E element Node
  • Spring Security OAuth2简单配置

    我有一个简单的项目 需要以下简单的配置 我有一个 密码 grant type 这意味着我可以提交用户名 密码 用户在登录表单中输入 并在成功时获得 access token 有了该 access token 我就可以请求 API 并获取用户
  • 尝试使用等于“是”或“否”的字符串变量重新启动 do-while 循环

    计算行程距离的非常简单的程序 一周前刚刚开始 我有这个循环用于解决真或假问题 但我希望它适用于简单的 是 或 否 我为此分配的字符串是答案 public class Main public static void main String a
  • 无法捕获 Spring Batch 的 ItemWriter 中的异常

    我正在编写一个 Spring Batch 流程来将数据集从一个系统迁移到另一个系统 在这种情况下 这就像使用RowMapper实现在传递给查询之前从查询构建对象ItemWriter The ItemWriter称为save我的 DAO 上的
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Java:多线程内的 XA 事务传播

    我如何使用事务管理器 例如Bitronix http docs codehaus org display BTM Home JBoss TS http www jboss org jbosstm or Atomikos http www a
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐