我有一个行星和一个月亮。月球是虚拟物体的父级,它位于行星的中心(基本上是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
位置,让月球在地球表面旋转。我搜索过类似的东西,却无法找到我正在寻找的东西。
此屏幕截图中显示的标记应该说"旋转到这里",但这基本上就是我的场景:
答案 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);
}
}
,例如。除以一个因素。
只要容器在行星中心,月球应始终与地面保持恒定距离,并且通过这种方法将始终保持相对于行星表面一致的“向上”方向。
希望这有帮助!如果您有任何问题,请告诉我。