Sky Delivery — Аварийная посадка

Во время полёта воздушное судно теряет шасси — знакомая ситуация? С сегодняшнего дня в моём авиасимуляторе это не проблема: теперь самолёт можно посадить на пузо.

Не так давно я реализовал возможность повреждения шасси в своём проекте. Следующим логичным шагом стала задача сделать возможной аварийную посадку.

До сих пор урон от физического столкновения рассчитывался очень примитивно. Я брал модуль импульса самолёта и передавал его целиком в качестве урона той части самолёта, которая получила коллизию.

Это, по сути, очень грубое решение. При равной скорости и лобовое столкновение, и удар по касательной давали одинаковое количество урона. Чтобы учитывать угол столкновения, я ввёл коэффициент hitCoef, который равен модулю косинуса угла между вектором скорости и нормалью поверхности столкновения.

Sky Delivery — Аварийная посадка

Таким образом, максимальное значение урона достигается при углах 180° и 0° — столкновение под прямым углом. Минимальное значение урона — при 90° и −90°, то есть коллизия по касательной.

Метод оказался настолько же действенным, насколько и простым. Осталось откалибровать HP для каждого самолёта, и теперь аэроплан можно посадить даже без шасси. Ниже приведу код обработки коллизии:

private void processCollision(Collision collision) { foreach (var contact in collision.contacts) { AircraftDestructiblePart contactPart = contact.thisCollider.GetComponent<AircraftDestructiblePart>(); if (contactPart != null && !contactPart.isDestroyed) { var normal = contact.normal; var velocity = collision.relativeVelocity.normalized; float hitAngle = Vector3.Angle(velocity, -normal) * Mathf.Deg2Rad; float hitCoef = Mathf.Abs(Mathf.Cos(hitAngle)); float currentDamage = 0; var rb = model.structure.rigidBody; if(hitCoef > 0 && collision.relativeVelocity.magnitude > _aircraftVelocityTreshold) currentDamage = rb.mass * collision.relativeVelocity.magnitude if (currentDamage > 0) contactPart.SendDamage(currentDamage * hitCoef); } break; } }

Если интересно следить за проектом, подпишитесь тут или в телеге!

14
12
1
14 комментариев