Unity3D:碰撞,获得碰撞表面的法线(不是影响角度)

时间:2012-07-04 15:55:34

标签: collision-detection unity3d

我正在研究我的第一个Unity项目(一个自我规定的崩溃课程),我遇到了一个小问题。

我正试图将一个物体偏离另一个物体(通过碰撞)。目前,偏转应该处于完全镜像的角度。没问题!我想,我看到这个超级方便的contact.normal财产;看起来很直接(我正在2D飞机上工作,所以它应该从那里顺利航行)。

一些令人沮丧的失败尝试,以及之后几千drawRay个命令,我意识到法线不是影响面的法线,而是正常的影响(即反映影响的角度) )。

这实际上是有用的信息,但为了有用,我需要一个面部法线来反映影响的角度。

移动物体正在使用this.rigidbody.velocity =所以我不能依赖内置的物理学;对于这种弹跳看起来我也是一个完全坚持的人,所以我真的很想保持对它的完全控制。

以下相关代码:

function OnCollisionEnter(collision : Collision)
{
    var contactCount : int = 0;
    var normalAve : Vector3 = Vector3(0,0,0);
    var velocityAve : Vector3 = Vector3.zero;

    for (var contact : ContactPoint in collision.contacts)
    {
        contactCount++;
        normalAve += contact.normal;

        velocityAve += collision.relativeVelocity;
        Debug.DrawRay(contact.point, contact.normal, Color.green, 2, false);
    }

    normalAve /= contactCount;
    velocityAve /= contactCount;

    var damage = Vector3.Dot(normalAve, velocityAve) * collision.rigidbody.mass;



    life -= damage;

    if(life <= 0)
    {
        // Stackoverflow people can ignore this, bounces
        // don't happen when you're dead
        this.rigidbody.useGravity = this.GetComponent(ship_small_physics).stage.GetComponent(stage_params).grav_on_hit;

        this.GetComponent(ship_small_physics).impact();
    }else{
        // Stackoverflow people! Right here!
        Debug.Log("survived! with " + life + " life");
        this.GetComponent(ship_small_physics).small_impact(normalAve, velocityAve);
    }
}

然后,在.small_impact

function small_impact(n : Vector3, v : Vector3)
{
    var h_angle : Vector3 = Vector3(n.x, 0, n.z);
    Debug.DrawRay(this.transform.position, n, Color.blue, 2, false);
    Debug.DrawRay(this.transform.position, h_angle, Color.red, 2, false);
}

只是为了澄清:游戏是在某种3D中,但由于种种原因,在这种情况下,我只关心x-z平面中的碰撞法线(飞机旧物理引擎不会的另一个原因)做)。这就是为什么我创建一个新的向量h_angle,它实际上就是将碰撞法线投影到x-z平面上。

0 个答案:

没有答案