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

По сети не летит ни траектория, ни угол ствола. Сервер рассылает три вещи: где стоит пушка, где плита и зерно выстрела. Каждая машина считает выстрел сама, а случайность берётся только из хеша от зерна — без генератора случайных чисел движка. Поэтому у всех игроков стержень проходит одной дорогой и пробивает одно и то же.
Один выстрел — четыре шага времени
Весь выстрел считается сразу, в миг нажатия: полёт, поддон, пробитие или рикошет. На это уходит около 0,1 с процессора. Ход выстрела записывается по времени, а показ потом только читает запись: вживую, камерами полёта или с замедлением ×80 у плиты.
Внутри одного выстрела события идут с очень разной скоростью, поэтому и шаг счёта у каждого этапа свой.
| Этап | Шаг | Шагов | Почему такой |
|---|---|---|---|
| Отделение поддона | 2 мкс | 6000 | первые 12 мсза шаг стержень пролетает 3,3 мм |
| Полёт | 50 мкс | ~3600 | на 300 мволна рыскания — 70 м пути |
| Пробитие | 50 нс | 4962 | плита 200 ммза шаг стирается ~42 мкм |
| Рикошет | 200 нс | ~3350 | касание 0,67 мснос и хвост на борозде |
Запись для показа — реже счёта: стержень при отделении поддона пишется раз в 10 мкс, в полёте — раз в 200 мкс, пробитие — раз в 2 мкс.
Поддон: три лепестка
Стержень тоньше канала ствола, его ведёт поддон из трёх алюминиевых лепестков по 1,15 кг. Каждый лепесток — твёрдое тело в своей плоскости. За стержень они держатся каждый своё время, 220 ± 60 мкс. Набегающий поток давит на передний «ковш» лепестка силой ½·ρ·v²·S и отворачивает его наружу.

Пока лепесток держится, его сила передаётся стержню — вбок и поворотом через плечо 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 об/с.

Пробитие по Тейту — Алексеевскому
Модель гидродинамическая: на таких скоростях и стержень, и броня у дна канала текут, как жидкости с прочностью. Дно уходит в броню со скоростью 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 # канал растёт
В кадре стержень идёт на 1615 м/с, а дно канала — на 782 м/с. Значит, за шаг стирается ~42 мкм стержня — одна пятисотая его диаметра. За 2 диаметра до тыльной грани броня начинает поддаваться: её сопротивление плавно падает до нуля, и пробку выбивает.
Почему именно 50 нс, проверили тем же счётом с другими шагами — плита 200 мм, у плиты 1631 м/с:
| Шаг | Шагов | Стержень после, мм | Скорость после, м/с | Предел, мм |
|---|---|---|---|---|
| 5 нс | 49 613 | 540,1 | 1590,8 | 644,3 |
| 50 нсв игре | 4962 | 540,1 | 1590,8 | 644,3 |
| 1 мкс | 249 | 539,5 | 1590,6 | 644,4 |
| 5 мкс | 50 | 538,2 | 1590,3 | 644,7 |
Шаг в 5 нс даёт те же цифры до десятой миллиметра, но шагов в 10 раз больше. Шаг в 5 мкс ошибается всего на 2 мм, только на всё пробитие остаётся 50 шагов — замедленному показу нечего показывать. 50 нс — самый крупный шаг, при котором показ (раз в 2 мкс) идёт плавно, а цифры не отличить от мелкого.
Если брони больше, чем стержень может пройти, канал кончается там, где стержень истёрся, а тыльная грань остаётся целой.

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

Рикошет: порог по Тейту
Предельный угол встречи считается по формуле Тейта для стержня:
tan³β = ⅔ · (ρс·v² / Y) · (L² + D²) / (L·D)За прочность брони Y взято то же сопротивление внедрению 5,5 ГПа: одна константа брони на оба явления. Порог выходит 80° на 1620 м/с — столько и дают современные стержни на стрельбах.
Положе порога стержень не входит, а скользит. Это плоская задача твёрдого тела с шагом 200 нс: нос и хвост под гранью давят на броню и пашут борозду, вал металла перед ними выталкивает их наружу под 40°, пара сил отворачивает стержень от плиты. Ушёл — проверяем изгиб против прочности 2,5 ГПа и ломаем на обломки.
Плита 200 мм под 85° на 300 м: борозда 963 мм длиной и 13 мм глубиной, стержень уходит на 1536 м/с тремя обломками.


Рёбра, как у Strv-103B
Чтобы «поиздеваться над физикой», на лицевую грань поставили рёбра: 40 мм высотой через каждые 180 мм. Ребро — та же броня. Сквозь ребро нос истирается по Тейту, а поперёк оси ребро давит долей сопротивления брони по сечению стержня.
Стержень считается свободной балкой с силой на конце: наибольший изгиб 4·F·L/27 — в трети длины от носа. Сломался — обломок носа идёт в плиту первым по тому же каналу, но теряет часть пробития на кувыркании.
Плита 120 мм под 78°: путь в броне — 569 мм. Ребро давит поперёк с силой 2044 кН и ломает нос — 245 мм от кончика. Остаток всё равно выходит с тыла на 1373 м/с.

37 сантиметров от 32 бит
На полигоне в 3 км от середины мира пушка стала мазать на 37 см вбок. В Godot Vector3 — 32-битный: на таком удалении шаг координаты ~0,24 мм, а за отделение поддона набирается 6000 шагов по 3,3 мм — округления складывались в промах.
Теперь полёт, лепестки и наводка считаются в координатах от дула, в мир переводятся только при записи. Промах стал 5 мм.
Дуэль и «Отклик»
Ради шутки сделали дуэль с ботом: две пушки в 1500 м, щиты по 200 мм, по 10 снарядов. Бот — та же пушка и тот же расчёт выстрела: исход каждая машина считает сама. Когда противник меряет до нас дальность лазером, загорается «Отклик» — сектор, откуда светят, и писк. Бот после этого торопится.


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