Unity - 具有不同速度的对象的相同转弯半径

时间:2016-10-26 15:29:10

标签: c# unity3d rotation

我有一个可以随脚本移动的简单圈子:

public float speed = 3f;
public float rotationSpeed = 200f;

private float horizontal = 0f;

void Update()
{
    horizontal = Input.GetAxisRaw("Horizontal");
}

void FixedUpdate()
{
    transform.Translate(Vector2.up * speed * Time.fixedDeltaTime, Space.Self);
    transform.Rotate(Vector3.forward * -horizontal * rotationSpeed * Time.fixedDeltaTime);
}

问题是我希望以不同的速度保持相同的转弯半径。 现在,当我提高速度时,转弯半径也越来越大:

like here

我该怎么做?我是否必须使用某种比率来提高速度和旋转速度?

1 个答案:

答案 0 :(得分:1)

有两种主要方法可以解决这个问题。首先,您可以计算转速相对于速度的变化率的微分方程,以保持半径不变,然后将其解决为转速。第二种也许更简单的方法如下:

粒子必须行进的距离是恒定的,假设是半圆形路径,则等于pi*r,否则为(theta/2pi)2pi*r

因此,我们可以计算物体的行程时间等于距离除以其切向速度,得到(pi*r)/V

最后,你的回合率等于2 * pi除以你需要回合的时间,得到R = 2Vpi/pi*r rads^-1。取而代之的是2Vr rads^-1

我不确定如何实现它的确切细节,但它看起来像这样:

void FixedUpdate()
{
    const int radius = 10;
    rotationSpeed = 2 * speed * radius;
    transform.Translate(Vector2.up * speed * Time.fixedDeltaTime, Space.Self);
    transform.Rotate(Vector3.forward * -horizontal * rotationSpeed * Time.fixedDeltaTime);
}

虽然我几乎肯定值得检查我的数学,因为我暂时没有做过这类事情。

第三种显着不那么优雅的方式是,您计算沿着抛物线的许多点的Vector3 position,这是您的路径,并且每FixedUpdate()移动到下一个点。然后你可以改变dx,使它对于更快的速度更大,对于更慢的速度则更小。这具有易于实现的优点,但如果重要的话,它完全破坏了应用程序的物理特性。