如何匹配另一个对象的旋转增量?

Posted

技术标签:

【中文标题】如何匹配另一个对象的旋转增量?【英文标题】:How to match another object's rotation delta? 【发布时间】:2021-12-18 23:23:38 【问题描述】:

我试图让一个对象匹配另一个对象的旋转增量。因此,如果对象 A 围绕 Y 轴旋转 90 度,我希望对象 B 也围绕 Y 轴旋转 90 度。因为我想在每一帧都这样做,所以我保存了两个对象的初始旋转。我尝试这样做,基于forum post:

objectB.transform.localRotation = (initialObjectARotation * Quaternion.Inverse(objectA.transform.localRotation)) * initialObjectBRotation;

问题是现在旋转是反转的(我不确定这是正确的术语,但如果我向右旋转objectA,那么objectB 向左旋转等等)。我该如何解决这个问题?

【问题讨论】:

他们有相同的父对象吗?或者你为什么使用局部旋转? 我正在使用localRotation,因为我希望它独立于父母的轮换。 但是localRotation(=相对于父级)正是不是您想要使用的,而是全局绝对值rotation ... 是的,你是对的,我的意思是我希望它相对于父母工作。这不是这里的主要问题,因为两个游戏对象都没有父对象。 【参考方案1】:

如果您从前一帧中获得了 B(进行匹配的主体)和 A(正在匹配的目标)的绝对旋转以及 A 的新绝对旋转,则可以解出 B 的新绝对旋转,解释沿每个对象的局部轴的差异:

Quaternion oldB; // previous global rotation of subject
Quaternion oldA; // previous global rotation of target
Quaternion newA = transformA.rotation; // current global rotation of target

// solve for new global rotation of subject
Quaternion newB = oldB * Quaternion.Inverse(oldA) * newA;

如果这给您带来您不喜欢的结果,您可以尝试沿全局轴解释差异:

// solve for new global rotation of subject
Quaternion newB = newA * Quaternion.Inverse(oldA) * oldB;

最后,如果你真的想要它相对于每个对象的父对象的轴,它有点复杂,因为它涉及到先前的父旋转(绝对),先前的对象局部旋转,和 A 的当前绝对旋转给你 B 的当前绝对值。:

Quaternion oldBParent; // previous global rotation of subject's parent
Quaternion oldBLocal; // previous local rotation of subject
Quaternion oldAParent; // previous global rotation of target's parent
Quaternion oldALocal; // previous local rotation of target

// solve for new global rotation of subject
Quaternion newB = oldBParent * Quaternion.Inverse(oldAParent) * newA 
        * Quaternion.Inverse(oldALocal) * oldBLocal;

注意,如果没有父级,则父级旋转为Quaternion.identity,相当于全局轴形式。整洁!


当然,一旦您拥有newB,您只需使用transformB.rotation = newB; 应用新的轮换。

【讨论】:

感谢小清新课程 ;) 最后我们将它们放在一个地方^^

以上是关于如何匹配另一个对象的旋转增量?的主要内容,如果未能解决你的问题,请参考以下文章

如何在模板匹配中找到 ROI 内对象的旋转?

如何通过平移、旋转和/或缩放调整来匹配两个分割蒙版

旋转对象以匹配向量

旋转模板图像并执行模板匹配

LeetCode 796 旋转字符串[字符串 匹配] HERODING的LeetCode之路

如果属性与另一个数组匹配,则检索数组中的对象