根据前轮方向和速度计算自行车方向


10

我有一个简单的自上而下的自行车游戏,我正在尝试增加转向功能。我想知道如何使用前轮的方向来确定自行车的方向和速度。

void Update () 
{
    //Get input from user Vertical: 0 to 1, Horizontal -1 to 1
    float forwardInput = Input.GetAxis("Vertical");
    float sidewaysInput = Input.GetAxis("Horizontal") * m_steeringAmount;

    // Turn front wheel
    m_frontWheelTransform.localEulerAngles = new Vector3(0, sidewaysInput, 90);

    // get speed and drag
    float   speed           = m_velocity.magnitude;
    Vector3 forwardDrag     = -m_forwardDragConstant * m_velocity * speed;

    // calculate acceleration 
    float engineForce       = forwardInput * m_enginePower;
    Vector3 forwardTraction = transform.forward * engineForce;
    Vector3 forwrdForce     = forwardTraction + forwardDrag;
    Vector3 acceleration    = forwrdForce / m_mass;

    // update velocity and position
    m_velocity += acceleration * Time.deltaTime;
    transform.localPosition += m_velocity * Time.deltaTime;
}

我曾尝试将自行车速度应用于前后轮,并利用位置的差异来确定自行车的前进方向,但是向前的阻力使其变得混乱。

根据madshogo评论进行编辑

在此处输入图片说明


我现在在电话上,所以我只给一个简短的答案:车轮与自行车行驶的假想圆相切,因此使自行车转弯。圆的中心在与每个车轮正交的线的交点处。如果车轮都是直的(自行车没有转弯),则这些线会无限远地越过路径(它们平行),从而形成无限半径的圆,即A线。最终,这将为您提供自行车应遵循的轨迹(圆)或其曲率,以适合您的需求为准。
jrsala 2012年

感谢您的答案madshogo。您能否看一下我添加的图表,然后告诉我是否正确。红线是自行车的标题。欢呼声
user346443

哦,等等,前轮未与图形中的圆相切。在我的头上,两个轮子都切线了。那改变了几件事。
jrsala 2012年

您是否已查看Wikipedia页面的自行车物理知识?对于倾斜的转弯半径,它具有有用的公式。
sam hocevar

Answers:


3

好的,我回来了!

动画自行车

我尝试了两种方法:

  • 使用固体力学来推导控制车轮中心运动的微分方程:系统“自行车”的输入是后轮的扭矩和前轮的角度,输出是中心的运动学的轮子。但是我放弃了,这很难!

  • 试图从几何的角度猜测当后轮向前“推”前轮而前轮不直时会发生什么。此方法直接产生一个无穷小增量的方程(请参见下文),从中可以得到实际的微分方程。我没有尝试操纵第一个方程来获得ODE,但我的猜测是,我将使用实体力学获得相同的ODE。感觉不错。

表示法和假设:

我们在飞机上有基向量exey

A是后轮的中心。B是前轮的中心。自行车的长度LAB之间的距离。之间的角度EY和矢量ABφAB与前轮之间的夹角为θ

直观的理由:

我们假设在某个时刻tA(t)的速度V(t)AB共线。因此,对于无限小的时间步长dt

A(T + DT)= A(T)+ V(t)的.DT

我们还假设,在时间t,前轮没有漂移,即B的速度与前轮的方向共线,即与AB形成角度θ。我们称为与AB形成角度θ的单位矢量,即与前轮方向相同的单位矢量。

因此,在t + dt

B(t + dt)= B(t)+λ.Uθ

对于某个真实的正λ,使得自行车L的长度保持不变:

距离(A(t + dt),B(t + dt))= L

计算:

最后一个等式转化为

范数(B(t)+λ.Uθ-A(t)-V(t).dt)=L²

但是根据定义,B(t)A(t)+L.Uφ,因此λ必须满足方程

范数(L.Uφ+λ.Uθ-V(t).dt)=L²

当然,解决方案与φ无关,因为当自行车指向正y时问题是相同的。因此,如果我们称R为旋转角为的旋转矩阵,则λ必须为

范数(L.ey; +λ.Uθ-RV(t).dt)=L²

一些计算后,如果我们称之为v的规范V,你会得到

λ= L.(sqrt(1-(sin(θ)。(1-v.dt / L))²)-cos(θ))+ v.dt.cos(θ)

这是我用来获取上述动画的伪代码(而不是使用,而是使用u = U(θ+φ),因为它更简单):

// I start at i=1 because i=0 contains the initial values
for (int i=1; i<=N; i++)
{
    // the array in which I stored the successive A points
    Aarray[i] = Aarray[i-1] + dt*V;
    float lambda = L*( sqrt(1 - (sin(theta)*(1-v*dt/L))**2) - cos(theta) )
                   + cos(theta)*v*dt;
    // the array in which I stored the successive B points
    Barray[i] = Barray[i-1] + lambda*u;
    // the AB vector normalized
    AiBiUnit = (Barray[i] - Aarray[i])/L;
    // Refreshing the velocity of A
    V = v*AiBiUnit;
    // Refreshing u.
    // u is indeed a unit vector separated from AiBiUnit by an angle theta,
    // so you get it by rotating the newly computed AiBiUnit by an angle
    // of +theta:
    u = AiBiUnit.rotate(theta);
}

我相信,如果重复很多次和/或增加转向角,轨迹就是一个圆,这是连贯的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.