旋转 Parent 使 Child 面向目标前进的相反方向
Rotating Parent to Make Child Face Opposite Direction of Target's Forward
场景:
- Parent P1 有 Child C1
- 目标存在
- 所有项目的前向矢量完全平行于 X-Z 平面(伪二维)
- 所有objects的位置都是任意的
- Child 永远不会在 Parent 的 space
中自行移动
目标:
仅围绕 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);
场景:
- Parent P1 有 Child C1
- 目标存在
- 所有项目的前向矢量完全平行于 X-Z 平面(伪二维)
- 所有objects的位置都是任意的
- Child 永远不会在 Parent 的 space 中自行移动
目标:
仅围绕 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);