如何将对象旋转到另一个对象周围的特定位置? (基本上围绕指定位置轨道运行)

时间:2016-11-30 20:31:45

标签: c# unity3d rotation

我有一个行星和一个月亮。月球是虚拟物体的父级,它位于行星的中心(基本上是0,0,0)。月球可以自由旋转(到地球上的任何位置)。它应与地球保持恒定的距离。

我有一个特定的观点,我想要将月亮旋转,尽管它需要保持直立。也就是说,月亮应该始终指向" up"相对于行星的表面。基本上它就像一个" moveTo"脚本只在我的情况下,月亮应该"旋转"在地球周围,直到它到达我正在寻找的地步。

这是我到目前为止所拥有的,但我无法找到正确的逻辑:

Vector3 targetDir = moveToPos - moon.transform.position;

float angle = Vector3.Angle( targetDir, moon.transform.up );

dummy.transform.RotateAround (moveToPos, moon.transform.up, angle);

我是否正确地考虑过这个问题?一旦我开始工作,我就想给月球喂不同的Vector3位置,让月球在地球表面旋转。我搜索过类似的东西,却无法找到我正在寻找的东西。

此屏幕截图中显示的标记应该说"旋转到这里",但这基本上就是我的场景:

Marker shows where the moon should be moved

enter image description here

1 个答案:

答案 0 :(得分:2)

通过将月亮嵌套在空转换中,您已经使事情变得更加轻松。如果它被正确设置*,这意味着你不必直接操纵月亮的transform - 你只需要旋转容器对象直到它面向目标位置。

* 通过这个,我的意思是容器对象相对于行星位于(0,0,0),并且月亮仅沿z轴局部平移,因此它与容器的{{ 1}}向量。

如果我们将问题分解为更小的步骤,问题就更容易解决:

  • 确定容器需要面对的目标方向。我们可以通过从目标位置减去容器的位置来实现此目的。
  • 计算容器面向目标方向所需的旋转。这是Quaternion.LookRotation()的好地方。
  • 旋转容器直至其方向与目标方向匹配。 Quaternion.Lerp()可用于实现此目的。

以下是您可以实施这些步骤的方法:

transform.forward

注意:如果月亮旋转太快(它将在~1秒内完成旋转),则每帧添加少于Quaternion targetRotation; Quaternion startRotation; float progress = 1; void SetTargetPosition(Vector3 position) { // Calculating the target direction Vector3 targetDir = position - dummy.transform.position; // Calculating the target rotation for the container, based on the target direction targetRotation = Quaternion.LookRotation(targetDir); startRotation = dummy.transform.rotation; // Signal the rotation to start progress = 0; } void Update() { if (progress < 1) { // If a rotation is occurring, increment the progress according to time progress += Time.deltaTime; // Then, use the progress to determine the container's current rotation dummy.transform.rotation = Quaternion.Lerp(startRotation, targetRotation, progress); } } ,例如。除以一个因素。

只要容器在行星中心,月球应始终与地面保持恒定距离,并且通过这种方法将始终保持相对于行星表面一致的“向上”方向。

希望这有帮助!如果您有任何问题,请告诉我。