如何匹配另一个对象的旋转增量?
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;
应用新的轮换。
【讨论】:
感谢小清新课程 ;) 最后我们将它们放在一个地方^^以上是关于如何匹配另一个对象的旋转增量?的主要内容,如果未能解决你的问题,请参考以下文章