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);
}