Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 使用四元数方向保持相对位置_Math_Quaternions - Fatal编程技术网

Math 使用四元数方向保持相对位置

Math 使用四元数方向保持相对位置,math,quaternions,Math,Quaternions,假设我有一个对象(A),其位置存储为3个数字向量,方向存储为四元数 我有第二个对象(B)具有相同的信息 不管出于什么原因,物体B突然焊接到物体A上。它现在被卡住了,应该可以相对于物体A完美地移动 如果对象B固定在对象a的一个角上,并且对象a旋转,则对象B在该角上的相对位置和方向应与以前相同 为了说明我的问题,应该如下所示: 到目前为止,我已经成功地获取了对象B的位置,并通过对象A的位置/方向的倒数变换它,存储了一个精确的相对位置-然后当对象A旋转时,我只需通过对象A的位置/方向变换相对位置,并

假设我有一个对象(A),其位置存储为3个数字向量,方向存储为四元数

我有第二个对象(B)具有相同的信息

不管出于什么原因,物体B突然焊接到物体A上。它现在被卡住了,应该可以相对于物体A完美地移动

如果对象B固定在对象a的一个角上,并且对象a旋转,则对象B在该角上的相对位置和方向应与以前相同

为了说明我的问题,应该如下所示:

到目前为止,我已经成功地获取了对象B的位置,并通过对象A的位置/方向的倒数变换它,存储了一个精确的相对位置-然后当对象A旋转时,我只需通过对象A的位置/方向变换相对位置,并将对象B传送到该位置。这将使对象B保持在A的角上,如预期的那样。。。但是,这不会旋转对象B以匹配对象A。。。我应该如何使用四元数或矩阵跟踪相对方向(Euler角只是最坏的情况,因为它们计算起来很昂贵)

编辑:我只有之前的四元数和之后的四元数。没有关于旋转本身的详细信息


此外,旋转是任意和自由的,它可以是围绕任意轴旋转,也可以同时围绕多个轴旋转。

您希望实现所述的算法


你需要绕一个任意的轴旋转B,这个轴与你旋转A的轴相同。我假设你有一个旋转的轴。如果不是,则可以使用A的中心点和平行于旋转法线的线计算一个

经过大量的谷歌搜索和实验,我终于找到了最完美的答案:无视原始想法,获取矩阵

B.Matrix*Invert(A.Matrix)
被存储为
relative
标记,然后要恢复,只需将B的矩阵替换为
relative*A.Matrix

这完美地调整旋转和位置在一个全能的猛扑


我不知道如何用四元数做同样的事情,但谁在乎,当我们有矩阵的时候

它不是绕轴旋转,而是自由旋转。我仅有的信息是四元数之前和之后的四元数。它围绕某个轴旋转,即使它是通过A的轴。每个旋转都有一个轴。但它可以同时围绕多个轴旋转。是的。然后需要将这些旋转作为单独的操作应用。我要说清楚,当我说轴时,我不是指X,Y,Z轴,我指的是一条线,它是旋转的轴,但我不能这样做。我不控制旋转物体的系统,我只是被赋予物体在任何给定时间点的位置/方向,需要保持物体准确地固定。(为了清楚起见:我将一个非物理对象粘贴到物理引擎中的物理对象上。物理引擎不提供“旋转事件”或任何东西,我只需对每个更新步骤做出反应)我正要回答这个问题!你完全走在正确的轨道上。忘记四元数、角度或位置。首先了解矩阵和线性变换。把矩阵想象成一个“空间”——在数学上它被称为“基”。通过将向量与矩阵相乘来变换向量会将其带入该空间。由此引出矩阵最不直观的一点:到空间A,从那里到B,与到B,再到A不一样。@starmole:说基(不是“基”)与空间相同是不正确的。基础是生成或“跨越”一个空间的东西,但同一个空间可以有许多不同的基础。在我们这里讨论的情况下,空间始终是R^3,旋转/平移只是坐标系的变化,而不是空间的变化。要进一步说明此解决方案的工作原理:将
a.Matrix
反转基本上将B转换为a的局部坐标系。完成后,我们可以通过应用
A.Matrix
,或者用数学术语:
relative*A.Matrix=B.Matrix*inv(A.Matrix)*A.Matrix=B.Matrix
,简单地将B与
A.Matrix
的其余部分一起变换,这样B就可以在世界坐标中保持其原始位置和变换,但用A的坐标系表示。@cfh您当然是对的。英语不是我的母语,这使得数学术语有点难(基础还是基础?)。但我也没有试图做到精确,而是乐于助人。我认为“空间”这个词描述了人们对3d图形的想法,但也许这是错误的,因为它在数学中不是正确的术语。