代码之家  ›  专栏  ›  技术社区  ›  Siddharth

汽车碰撞返回力-3D汽车游戏

  •  -1
  • Siddharth  · 技术社区  · 6 年前

    根据我的游戏要求,当两辆车相互碰撞并向后移动时,我正在给手动力。 所以我想要正确的代码来证明这一点。下面是我想要得到的碰撞响应示例:

    enter image description here

    根据我的理解,我编写了以下代码:

     Vector3 reboundDirection = Vector3.Normalize(transform.position - other.transform.position);
        reboundDirection.y = 0f;
        int i = 0;
        while (i < 3)
        {
            myRigidbody.AddForce(reboundDirection * 100f, ForceMode.Force);
            appliedSpeed = speed * 0.5f;
            yield return new WaitForFixedUpdate();
            i++;
        }
    

    我在移动,我的车使用以下代码:

        //Move the player forward       
        appliedSpeed += Time.deltaTime * 7f;
        appliedSpeed = Mathf.Min(appliedSpeed, speed);
        myRigidbody.velocity = transform.forward * appliedSpeed;
    

    但是,根据我的观察,我没有得到,碰撞反应在正确的方向上。获得上面的图像参考碰撞响应的正确方法是什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ali Kanat    6 年前

    在您阐明为什么使用手动力或如何处理Unity引擎生成的力之前,我想在您的方法中强调一个问题。你根据位置来计算方向,但位置是汽车的中心。因此,您无法获得正确的方向,如下图所示:

    enter image description here

    你计算两个支点或中心点之间的方向,因此,你的力在左图中有点倾斜。你可以用这个代替它 ContactPoint 然后计算方向。

    作为更详细的信息,让操作人员能够理解我说的话!在上面的图像中,您可以看到蓝色矩形的区域。您将使用 Collision.contacts

    enter image description here 然后像这样计算中心点或质心

    Vector3 centroid = new Vector3(0, 0, 0);
    foreach (ContactPoint contact in col.contacts)
        {           
            centroid += contact.point;
        }
        centroid = centroid / col.contacts.Length;
    

    这是矩形的中心,可以找到您在汽车上找到其投影所需的方向,如下所示:

        Vector3 projection = gameObject.transform.position;
        projection.x = centroid.x;
        gameObject.GetComponent<Rigidbody>().AddForce((projection - centroid  )*100, ForceMode.Impulse);
    

    因为我不知道你的设置,所以我只从车的位置得到了y和z值,而从 centroid 因此,你得到一条蓝色直线,而不是像第一幅图像那样向左倾斜的箭头,即使在第二幅图像的情况下也是如此。我希望我说得清楚。