Unity中计算炮弹穿透力

2019-03-29  本文已影响0人  于阿法

如图:

已知装甲厚度d(蓝色),求等效装甲厚度D(红色)。根据三角函数,D = d/Cos(θ)。
要求θ角,就要知道炮弹入射方向和击中点装甲的法线方向。
注意:要正确的求解θ角,还要将法线方向翻转。

计算参考

代码如下:

private void OnCollisionEnter(Collision collision){
      //翻转后的法线方向
      Vector3 normal = -collision.contacts[0].normal;
      //炮弹的速度
      Vector3 velocity = GetComponent<Rigidbody>().velocity;
      //求θ角,因为Unity内置的Mathf.Cos函数,参数是用弧度表示,所以将其转换为弧度
      float angle = Vector3.Angle(velocity, normal) * Mahtf.Deg2Rad;
      //这样就得到等效装甲厚度,将其与炮弹穿透力进行比较,就能知道炮弹能否击穿装甲
      D = d / Mathf.Cos(angle);
}

在炮弹速度很快的时候,由于刚体默认的精度问题,得到的结果可能会很奇怪。
这时可以修改炮弹刚体组件的碰撞检测为连续,以提升精度。


弹孔贴花

有了法线法向和碰撞点,那么弹孔贴花也就可以制作(未验证),代码如下:

private void OnCollisionEnter(Collision collision)
{
      //贴花位置
      Vector3 position = collision.contacts[0].point;
      //贴花朝向
      Vector3 normal = -collision.contacts[0].normal;
      //实例化贴花
      GameObject decal = Instantiate(decalPrefab, position, 
            Quaternion.LookRotation(normal));
      //设置父物体
      decal.transform.SetParent(collision.transform);
 }
上一篇下一篇

猜你喜欢

热点阅读