Unity3D:碰撞后获得速度

时间:2016-09-14 23:40:34

标签: c# unity3d physics collision velocity

我正在制作一个台球游戏,我有两个问题:

如何在两个球相互碰撞时找到两个球的速度,如何将它应用于两个球?

我已经知道他们将要移动的角度,我只需要找到他们将朝这些方向移动的速度。

我从不擅长物理/物理编程,所以我很感激任何帮助!顺便说一下,我的游戏是3D游戏。

感谢您的时间!

编辑:我要做的是使移动方向与我使用此脚本计算的方向相匹配:

if (Physics.Raycast(ray, out hit, Mathf.Infinity, lmm))
{
    location = new Vector3(hit.point.x, 1.64516f, hit.point.z);
}

if (Physics.SphereCast(transform.position, 0.77f, location - transform.position, out hitz, Mathf.Infinity, lmm2))
{
    if (hitz.collider.tag == "Ball")
    {
        Vector3 start = hitz.point;
        end = start + (-hitz.normal * 4);
        lineRenderer2.SetPosition(1, end);
    }

}

2 个答案:

答案 0 :(得分:1)

你可以通过对每个球施加冲动来计算新的速度。我们可以申请牛顿第三定律。伪代码:

    RelativeVelocity = ball1.velocity - ball2.velocity;
    Normal = ball1.position - ball2.position;
    float dot = relativeVelocity*Normal;
    dot*= ball1.mass + ball2.mass;
    Normal*=dot;
    ball1.velocity += Normal/ball1.mass;
    ball2.velocity -= Normal/ball2.mass;
然而,这并没有考虑到两个球之间的摩擦力以及它们的角动量。

答案 1 :(得分:0)

如果我理解正确,你要做的就是应用" Ball A"作为球B"的力量,反之亦然。如果是这种情况,我会建议这样的事情:

将此脚本附加到所有球:

public class BallCollisionScript : MonoBehaviour 
{   
    public Rigidbody Rigid_Body;

    void Start()
    {
        Rigid_Body = this.GetComponent<Rigidbody>();
    }

    void OnCollisionEnter(Collision collision) 
    {
        if (collision.gameObject.tag.Equals("Ball"))
        {
            BallScript otherBall = collision.gameObject.GetComponent<BallScript>();
            Rigid_Body.AddForce(otherBall.Rigid_Body.velocity);
        }
    }
}

确保所有球都标有&#34; Ball&#34;。