问题标签 [quaternions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
math - 组合旋转轴向量
我正在尝试在我的爱好游戏引擎中使用轴角向量进行旋转。这是一个沿旋转轴的 3 分量矢量,旋转长度以弧度为单位。我喜欢它们,因为:
- 与四元组或旋转矩阵不同,我实际上可以看到数字并在脑海中可视化旋转
- 它们比四元数或矩阵的内存少一点。
- 我可以表示 -Pi 到 Pi 范围之外的值(如果我存储角速度,这很重要)
但是,我有一个紧密的循环,可以根据它们的角速度更新我所有对象(数万个)的旋转。目前,我知道组合两个旋转轴向量的唯一方法是将它们转换为四元数,将它们相乘,然后将结果转换回轴/角度。通过分析,我发现这是一个瓶颈。有谁知道更直接的方法?
math - 带速率匹配的四元数插值
我有一个带有方向的对象以及围绕每个身体轴的旋转速率。我需要找到从这种状态到具有不同速率集的第二种状态的平稳过渡。此外,我对围绕每个轴旋转/加速的速度有限制。
我已经探索过 Quaternion slerp,虽然我可以使用它们在状态之间进行平滑插值,但我没有看到一种简单的方法来获得速率匹配。
这感觉就像是微分方程和路径规划的练习,但我不确定如何准确地制定问题,以便现有的算法可以解决它。
任何可以帮助解决此问题的算法建议和/或有关制定与这些算法一起使用的问题的提示将不胜感激。
[编辑 - 这是我正在处理的问题类型的示例]
想象一下直升机上的炮手需要在直升机飞行时跟踪目标。为了争论起见,他需要从目标升起到不再出现在视野中。这个目标的相对速率不是恒定的,但我假设通过几个“速率匹配”操作的聚合,我可以很好地近似这个跟踪。我可以计算任何时候所需的枪方向和跟踪速率,它只是从一些让我难过的离散方向和速率生成一个配置文件。
谢谢!
c++ - 如何获得类似玛雅的旋转?
我试图在我的项目中实现与 Maya 相同的旋转效果。我对四元数和轨迹球示例有一些了解。
不幸的是,我仍然无法理解使用四元数来获得预期效果的概念。
基本上,我仍然遇到与 3d 轨迹球相同的问题。将对象倒置后,然后尝试向右旋转,对象将向左旋转。好吧,实际上它是我的相机以相反的方向围绕焦点旋转。
问题是我正在使用屏幕坐标和轨迹球来获取旧/新向量并从这两个向量中获取旋转角度。这样我总是会得到错误的旋转轴。
我应该如何解决这个问题?
c# - 在 C# 中使用四元数表示陀螺仪角度
我正在使用 WiiM+ 陀螺仪来计算旋转。
我将沿偏航、俯仰和横滚轴的转动速率积分,并将其存储在一个名为 angleSum 的向量中
因此对于每个读数,angleSum(reading) 表示从初始方向开始的 y、p 和 r 旋转。
然后我使用四元数(我完全不熟悉)来表示如下:
q = Quaternion.createfromyawPitchRoll(angleSum.yaw, angleSum.pitch, angleSum.roll*(-1))
但是当我将我的 wiimote 向一个方向旋转 90 度并打印出 qx、qy 和 qz 以进行转弯时,所有读数都会受到转弯的影响(它们都显示 90 度的转弯和返回,尽管其中两个的幅度较小)
我的问题很基本:我究竟如何使用这个四元数结构来表示方向?我需要偏航、俯仰和滚动方面的绝对(或至少相对)方向。
谢谢!
java - 在 1 轴上旋转四元数?
我有一个由四元数旋转的模型。我只能设置旋转,我不能添加或减去任何东西。我需要获取轴的值,然后为其添加一个角度(可能是度数或弧度?),然后重新添加修改后的四元数。
我怎样才能做到这一点?(每个轴上的答案)。
c++ - 在 C++ 中为代数结构矩阵使用类的开销
我正在使用 C++ 编写一些复杂的 FFT 算法,因此我需要实现四元数和 Hamilton-Eisenstein 码等代数结构。算法适用于该结构的二维数组。将它们实现为类的开销是多少?换句话说,我应该创建包含四元数类的 [M][N] 维度的数组,还是应该创建 [M][N][4] 数组并将 [4] 数组用作四元数?使用类更方便,但是创建 M*N 类并访问它们的方法而不是只使用数组 - 这不会有太多开销吗?我正在为大型图像处理编写算法,所以性能对我来说很重要。
iphone - OpenGL ES 轨迹球变换问题
我已经使用 Objective C++ 将我一直在使用的 arcball 类从 vb.net 移植到了 iPhone,但现在我遇到了问题。当我旋转我的对象时,一切都很好。平移视图后,我的旋转中心不再像以前那样位于对象原点的中心。理想情况下,我希望能够设置旋转点在对象参考框架中的位置。我不确定我需要在轨迹球例程中的哪个位置进行更改才能执行此操作。我基于我的实现可以在以下链接中找到:
http://www.codeproject.com/KB/openGL/Tao_Arcball.aspx
我对它的行为方式进行了一些小的修改并将其转换为触摸界面,但就我遇到的问题而言,它的行为方式仍然与此实现相同。
这些链接解释了四元数和矩阵旋转背后的更多数学:
http://www.j3d.org/matrix_faq/matrfaq_latest.html http://www.gamedev.net/reference/articles/article1095.asp http://en.wikipedia.org/wiki/Quaternion_rotation
我想必须修改的代码的主要部分如下(在 vb.net 中):
编辑:
我几乎想出了如何做到这一点。我已经到了可以为我的 Arcball 设置旋转中心的地步,但现在我遇到了另一个问题。当我应用变换围绕指定的中心点进行旋转时,有两个问题:
模型跳转到不同的位置。我想将模型保持在完全相同的位置和方向。
该模型围绕新的中心点进行缩放,但我希望模型围绕用户用两根手指触摸的平均点进行缩放。
对于 2 号,我想我知道该怎么做,但我需要弄清楚 1 号才能使 2 号正常工作。对于数字 2,我可以将平均触摸点投影到与近平面平行但穿过零件原点的平面,然后将其作为我的旋转中心,直到用户抬起手指。对 1 号有什么想法吗?我用于更改旋转中心的代码如下:
仅供参考,OpenGL 以相反的顺序应用矩阵变换,因为它的堆栈是如何工作的。所以在我的代码中,底线将首先执行,然后从那里开始。它有效地移动模型,使其旋转中心位于原点,然后旋转/缩放,然后将模型平移到需要平移的位置。
我相信我遇到的问题是我需要在平移时添加 centerOfRotation,但问题是一旦模型旋转,需要以某种方式将 centerOfRotation 点转换为不同的模型空间。在我旋转模型之前它工作正常,但是一旦引入旋转,一切都会爆炸。
vector - 将单位向量转换为四元数
所以我对四元数很陌生,但我了解如何用它们操作东西的基础知识。我目前正在尝试做的是将已知四元数与空间中的两个绝对点进行比较。我希望我能做的就是简单地将这些点转换为第二个四元数,给我一个简单的方法来比较两者。
到目前为止我所做的是将两个点变成一个单位向量。从那里我希望我可以直接将 ijk 插入四元数的虚部,标量为零。从那里我可以将一个四元数乘以另一个的共轭,得到第三个四元数。这第三个四元数可以转换为轴角,给出原始两个四元数相差的程度。
这个思维过程正确吗?所以它应该只是[0 ijk]。之后我可能需要对四元数进行归一化,但我不确定。
我有一种不好的感觉,它不是从向量到四元数的直接映射。我尝试将单位向量转换为轴角度,但我不确定这是否可行,因为我不知道要给出什么角度作为输入。
math - Unity3D 和矢量数学 - Slepr、Lerp、四元数
我已经研究了 unity3d 几个月了,我对这个数学概念进行了一些研究,我们可以在移动/旋转物体时使用这些概念。
我已经阅读了一些数学解释,但我看不出它如何在 unity3d 上应用/满足我的需求。
谁能指出关于这两个概念的好材料,或者在我需要使用四元数和 slerp 时尝试向我解释?为什么我必须使用它?什么时候?
我会很感激我能得到的任何帮助。
flash - 四元数立方体旋转动画
我用 Papervison3D 创建了这个魔方。使用一些资源,我创建了一个内部有 27 个小立方体的立方体 (3*3*3 = 27)。在鼠标移动时旋转魔方已经完成。(我不旋转相机。)
魔方的所有行为都已经存在。但我有点卡在最后阶段。
当我像使用普通魔方一样使用它时,它工作正常,此外我知道默认的欧拉旋转值在一段时间后不再可靠。我需要将魔方旋转到选定的一侧,然后在 z 轴上旋转魔方,使迷你魔方面朝上。我更喜欢使用 TweenMax 对其进行动画处理,但我真的被困住了,因为我需要四元数旋转。
我知道魔方本身的选定面。我知道魔方的欧拉旋转使用Matrix3D.matrix2euler(_rubiksCube.transform);
我需要的是将它旋转到选定的面,例如当当前旋转是x: -20, y: 35, z: 10
并且我选择它必须旋转到的魔方的背面时x:0, y: 180, z: 0
。
我需要将其更改为四元数值并将魔方旋转到新的四元数值。之后,它必须在它的 z 轴上旋转魔方,使选定的小魔方面朝上。
这是我在拖动/旋转魔方时使用的代码