← все статьи

Titancraft, день двенадцатый: подкалиберный, который считается шагами по 50 наносекунд

Двенадцатый день Titancraft. В игре появилась пушка следующей эпохи — 120-мм гладкоствольная, с бронебойным подкалиберным снарядом (БОПС, по-английски APFSDS). Задача была «с полной симуляцией»: отделение поддона, вращение стержня, пробитие плиты гомогенной брони, а не готовая таблица попаданий. Эта запись — о том, какие формулы стоят за одним выстрелом и почему шаг счёта у пробития — 50 наносекунд.

Наводчик и вычислитель

Игрок встаёт к пушке и водит сетку прицела. Лазерный дальномер меряет дальность по лучу сетки — до плиты, земли или воды, до 5 км. Вычислитель (Apfsds.solve_elevation) поднимает ствол так, чтобы стержень прошёл через точку сетки на этой дальности: гоняет материальную точку с тем же сопротивлением воздуха и поправляет угол, пока промах не станет меньше 2 мм.


Прицел наводчика: кратность ×24, дальность 300 м по дальномеру; слева камера сбоку в разрезе, справа камера у мишени
Прицел ×24: дальномер намерил 300 м, слева — разрез плиты, справа — камера у мишени

По сети не летит ни траектория, ни угол ствола. Сервер рассылает три вещи: где стоит пушка, где плита и зерно выстрела. Каждая машина считает выстрел сама, а случайность берётся только из хеша от зерна — без генератора случайных чисел движка. Поэтому у всех игроков стержень проходит одной дорогой и пробивает одно и то же.

Один выстрел — четыре шага времени

Весь выстрел считается сразу, в миг нажатия: полёт, поддон, пробитие или рикошет. На это уходит около 0,1 с процессора. Ход выстрела записывается по времени, а показ потом только читает запись: вживую, камерами полёта или с замедлением ×80 у плиты.

Внутри одного выстрела события идут с очень разной скоростью, поэтому и шаг счёта у каждого этапа свой.

Запись для показа — реже счёта: стержень при отделении поддона пишется раз в 10 мкс, в полёте — раз в 200 мкс, пробитие — раз в 2 мкс.

Поддон: три лепестка

Стержень тоньше канала ствола, его ведёт поддон из трёх алюминиевых лепестков по 1,15 кг. Каждый лепесток — твёрдое тело в своей плоскости. За стержень они держатся каждый своё время, 220 ± 60 мкс. Набегающий поток давит на передний «ковш» лепестка силой ½·ρ·v²·S и отворачивает его наружу.


Камера полёта у дула: три лепестка поддона расходятся от стержня, 5 мс после выстрела
5 мс после выстрела: лепестки в 0,21 м от оси

Пока лепесток держится, его сила передаётся стержню — вбок и поворотом через плечо 5 см. Кто отпустил раньше, тот и толкнул стержень в свою сторону. Так рыскание от поддона получается само, без таблицы разброса. Дальше лепестки кувыркаются — давление на ковш впереди центра масс делает их неустойчивыми — и падают на землю.

Полёт: сопротивление, рыскание, вращение

Стержень — вольфрамовый сплав 17 600 кг/м³: 740 мм длиной, 22 мм в диаметре, 4,95 кг, вылетает на 1650 м/с. Сопротивление растёт с рысканием ψ — углом между носом и скоростью:

F = ½·ρ·v²·S·Cd·(1 + 12·ψ²),   Cd = 0,78

Рыскание — затухающий осциллятор в двух поперечных осях. Частота растёт со скоростью — одна волна на 70 м пути, размах падает в e раз за 260 м:

ψ'' = −ω²·ψ − 2k·ψ' + толчок поддона,   ω = 2π·v / 70 м,   k = v / 260 м

Начальный сбой задают дульные газы: до 0,15° по углу. Перья скошены на 0,5°, и стержень раскручивается к равновесному ω = v·tan(0,5°) / R_пера — к 20 мс это 50 об/с.


Камера полёта рядом со стержнем: оперение, конус ударной волны, 20 мс после выстрела
20 мс: 1647 м/с, 50 об/с, рыскание 0,05°

Пробитие по Тейту — Алексеевскому

Модель гидродинамическая: на таких скоростях и стержень, и броня у дна канала текут, как жидкости с прочностью. Дно уходит в броню со скоростью u, которая находится из баланса давлений:

½·ρс·(v − u)² + Yс = ½·ρп·u² + Rп

Здесь прочность стержня — 1,8 ГПа, сопротивление брони внедрению — 5,5 ГПа, плотность брони — 7850 кг/м³. Уравнение квадратное по u. На каждом шаге в 50 нс нос стирается, хвост тормозит, канал растёт:

tail -= (v - u) * STEP_PIERCE                                    # нос стирается
v -= ROD_STRENGTH / (ROD_DENSITY * tail) * STEP_PIERCE           # хвост тормозит
hole += u * STEP_PIERCE                                          # канал растёт


Камера у плиты: стержень входит в плиту 200 мм, канал 88 мм, дно канала идёт на 782 м/с
Канал 88 мм из 200: дно идёт на 782 м/с, от стержня — 647 мм

В кадре стержень идёт на 1615 м/с, а дно канала — на 782 м/с. Значит, за шаг стирается ~42 мкм стержня — одна пятисотая его диаметра. За 2 диаметра до тыльной грани броня начинает поддаваться: её сопротивление плавно падает до нуля, и пробку выбивает.

Почему именно 50 нс, проверили тем же счётом с другими шагами — плита 200 мм, у плиты 1631 м/с:

Шаг в 5 нс даёт те же цифры до десятой миллиметра, но шагов в 10 раз больше. Шаг в 5 мкс ошибается всего на 2 мм, только на всё пробитие остаётся 50 шагов — замедленному показу нечего показывать. 50 нс — самый крупный шаг, при котором показ (раз в 2 мкс) идёт плавно, а цифры не отличить от мелкого.

Если брони больше, чем стержень может пройти, канал кончается там, где стержень истёрся, а тыльная грань остаётся целой.


Плита 700 мм на просвет: канал кончился на 644 мм, от стержня остался 1 мм
Плита 700 мм: канал 644 мм, от стержня — 1 мм

Перья шире входа

Размах перьев — 90 мм, а дыра на входе — 37 мм. Перья в канал не проходят: они бьют о лицевую грань, когда до неё доходит хвост. На 300 м это случается через 0,46 мс после удара носа: перья срезаются, оплавляются, а на грани остаются шесть прорезей — по повороту стержня в этот миг.


Перья ударили о лицевую грань: вспышка, брызги расплава, шесть прорезей вокруг входа
Перья о грань на 1591 м/с — срезаны и оплавлены

Рикошет: порог по Тейту

Предельный угол встречи считается по формуле Тейта для стержня:

tan³β = ⅔ · (ρс·v² / Y) · (L² + D²) / (L·D)

За прочность брони Y взято то же сопротивление внедрению 5,5 ГПа: одна константа брони на оба явления. Порог выходит 80° на 1620 м/с — столько и дают современные стержни на стрельбах.

Положе порога стержень не входит, а скользит. Это плоская задача твёрдого тела с шагом 200 нс: нос и хвост под гранью давят на броню и пашут борозду, вал металла перед ними выталкивает их наружу под 40°, пара сил отворачивает стержень от плиты. Ушёл — проверяем изгиб против прочности 2,5 ГПа и ломаем на обломки.

Плита 200 мм под 85° на 300 м: борозда 963 мм длиной и 13 мм глубиной, стержень уходит на 1536 м/с тремя обломками.

Рикошет под 85°: стержень лежит на борозде, нос стёрт до 702 мм
Рикошет под 85°: стержень лежит на борозде, нос стёрт до 702 мм
Хвост шлёпает по плите, стержень уходит — борозда ещё раскалена
Хвост шлёпает по плите, стержень уходит — борозда ещё раскалена

Рёбра, как у Strv-103B

Чтобы «поиздеваться над физикой», на лицевую грань поставили рёбра: 40 мм высотой через каждые 180 мм. Ребро — та же броня. Сквозь ребро нос истирается по Тейту, а поперёк оси ребро давит долей сопротивления брони по сечению стержня.

Стержень считается свободной балкой с силой на конце: наибольший изгиб 4·F·L/27 — в трети длины от носа. Сломался — обломок носа идёт в плиту первым по тому же каналу, но теряет часть пробития на кувыркании.

Плита 120 мм под 78°: путь в броне — 569 мм. Ребро давит поперёк с силой 2044 кН и ломает нос — 245 мм от кончика. Остаток всё равно выходит с тыла на 1373 м/с.


Плита 120 мм под 78° с рёбрами: итог выстрела — нос сломан о ребро, плита пробита
Плита 120 мм под 78°: ребро давит поперёк 2044 кН и ломает нос (245 мм), плита всё равно пробита — осталось 103 мм стержня

37 сантиметров от 32 бит

На полигоне в 3 км от середины мира пушка стала мазать на 37 см вбок. В Godot Vector3 — 32-битный: на таком удалении шаг координаты ~0,24 мм, а за отделение поддона набирается 6000 шагов по 3,3 мм — округления складывались в промах.

Теперь полёт, лепестки и наводка считаются в координатах от дула, в мир переводятся только при записи. Промах стал 5 мм.

Дуэль и «Отклик»

Ради шутки сделали дуэль с ботом: две пушки в 1500 м, щиты по 200 мм, по 10 снарядов. Бот — та же пушка и тот же расчёт выстрела: исход каждая машина считает сама. Когда противник меряет до нас дальность лазером, загорается «Отклик» — сектор, откуда светят, и писк. Бот после этого торопится.

«Отклик»: противник меряет до нас дальность — горит сектор
«Отклик»: противник меряет до нас дальность — горит сектор
Наш стержень с 1492 м пробил щит 200 мм — орудие противника выбито
Наш стержень с 1492 м пробил щит 200 мм — орудие противника выбито

Пока стрелок смотрит свой выстрел камерами полёта, дуэль не встаёт на паузу: её часы идут со временем показа. Поэтому возможен итог «выбиты оба» — противник успел выстрелить, пока наш стержень летел.

Что осталось в игре

  • Стержень и дальномер начнут задевать деревья и постройки на пути.
  • Второе попадание в старую дыру пойдёт по уже ослабленной броне.
  • Удар о ребро и борозда при рикошете — полным расчётом удара, вместо балки и объёма борозды.
  • Лепестки поддона разойдутся так же быстро, как на съёмках настоящих выстрелов.
  • Новые снаряды — кумулятивный и осколочно-фугасный, и разнесённая броня.

Нужна физика, которая считается честно?
Начните с брифа: четыре вопроса и честный ответ, подходим ли мы друг другу.
Пройти бриф