使用四元数方向保持相对位置
Keep a relative position using quaternion orientation
假设我有一个对象 (A),其位置存储为 3 数向量,方向存储为四元数。
我有第二个对象 (B) 具有相同的信息。
物体 B,无论出于何种原因,突然焊接到物体 A。它现在被卡住了,并且应该相对于物体 A 完美地移动。
如果物体 B 粘在物体 A 的一个角上,并且物体 A 旋转,则物体 B 在同一角上的相对位置和方向应该与之前相同。
为了说明我的问题,它应该看起来像这样:
到目前为止,我已经设法获取对象 B 的位置并通过对象 A 的倒数变换它 position/orientation,存储准确的相对位置 - 然后当对象 A 旋转时,我只需变换相对位置通过对象 A 的 position/orientation,并将对象 B 传送到该位置。正如预期的那样,这会将对象 B 保持在 A 的角落......但是,这不会 旋转 对象 B 以匹配对象 A......我应该如何跟踪相对方向,使用四元数或矩阵(欧拉角只是最坏的情况,因为它们的计算成本很高)。
编辑:我只有之前的四元数和之后的四元数。没有关于旋转本身的详细信息。
另外,旋转是任意的,自由的,可以绕任意一个轴,也可以同时绕多个轴。
您想要实现描述的算法 here。
您需要围绕任意轴旋转 B - 与您旋转 A 的轴相同。我假设您有一个旋转 A 的轴。如果不是,您可以使用 A 的中心点和平行于旋转法线的线来计算一个。
经过大量谷歌搜索和实验,我得到了最完美的答案:无视原始想法,获取矩阵!
B.Matrix * Invert(A.Matrix)
存储为relative
标记,然后要恢复,只需将B的矩阵替换为relative * A.MATRIX
。
这一次完美地调整了旋转和位置。
我不知道如何对四元数做同样的事情,但谁在乎呢,当我们有矩阵的时候!
假设我有一个对象 (A),其位置存储为 3 数向量,方向存储为四元数。
我有第二个对象 (B) 具有相同的信息。
物体 B,无论出于何种原因,突然焊接到物体 A。它现在被卡住了,并且应该相对于物体 A 完美地移动。
如果物体 B 粘在物体 A 的一个角上,并且物体 A 旋转,则物体 B 在同一角上的相对位置和方向应该与之前相同。
为了说明我的问题,它应该看起来像这样:
到目前为止,我已经设法获取对象 B 的位置并通过对象 A 的倒数变换它 position/orientation,存储准确的相对位置 - 然后当对象 A 旋转时,我只需变换相对位置通过对象 A 的 position/orientation,并将对象 B 传送到该位置。正如预期的那样,这会将对象 B 保持在 A 的角落......但是,这不会 旋转 对象 B 以匹配对象 A......我应该如何跟踪相对方向,使用四元数或矩阵(欧拉角只是最坏的情况,因为它们的计算成本很高)。
编辑:我只有之前的四元数和之后的四元数。没有关于旋转本身的详细信息。
另外,旋转是任意的,自由的,可以绕任意一个轴,也可以同时绕多个轴。
您想要实现描述的算法 here。
您需要围绕任意轴旋转 B - 与您旋转 A 的轴相同。我假设您有一个旋转 A 的轴。如果不是,您可以使用 A 的中心点和平行于旋转法线的线来计算一个。
经过大量谷歌搜索和实验,我得到了最完美的答案:无视原始想法,获取矩阵!
B.Matrix * Invert(A.Matrix)
存储为relative
标记,然后要恢复,只需将B的矩阵替换为relative * A.MATRIX
。
这一次完美地调整了旋转和位置。
我不知道如何对四元数做同样的事情,但谁在乎呢,当我们有矩阵的时候!