旋转 Parent 使 Child 面向目标前进的相反方向

Rotating Parent to Make Child Face Opposite Direction of Target's Forward

场景:

目标:

仅围绕 Y-Axis 旋转 P1,使 C1 面向目标前向矢量的相反方向

注意:Y-Axis正片会面对reader,负片会进入屏幕

实施:

P1.rotation = Quaternion.LookRotation(-target.forward) * Quaternion.Euler(0, -C1.localEulerAngles.y, 0);

上面的大部分时间似乎都有效,但会随机中断,有时会生成一个零向量作为前向。我对欧拉角和四元数没有经验,所以我提前道歉。

表示此变换的一种简单方法是 目标旋转加上围绕上轴的 180 度,可以表示如下:

P1.rotation = target.rotation * Quaternion.AngleAxis(180, Vector3.up);

请注意,顺序确实很重要,尤其是在 3D 中使用它时 space(如果前向矢量在 2D 中位于同一平面上,它的工作原理完全相同)。

外观如下:

使用一些四元数代数:

在 Unity 中给出这个 terms/c#:

Desired child world = Quaternion.LookRotation(-target.forward)

鉴于:

Desired child world = desired parent world * child local

两边相乘:

Desired child world * inverse(child local) = desired parent world * child local 
                                             * inverse(child local)
                                           = desired parent world

用Unity/C#代入表示,得到:

P1.rotation = Quaternion.LookRotation(-target.forward) 
        * Quaternion.Inverse(C1.localRotation);