2

我现在正在处理我的第一个 Unity 项目(有点自我规定的速成课程),我遇到了一个小问题。

我正在尝试将一个物体从另一个物体上偏转(通过碰撞)。现在,偏转应该是一个完美的镜像角度。没问题!我心想,我看到了这个超级方便的contact.normal属性;看起来很简单(我在二维平面上工作,所以从那里开始应该是一帆风顺的)。

几次令人沮丧的失败尝试,以及数千个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平面上的投影。

4

0 回答 0