Сегодня знаменательная дата! 02.06.2024 можно считать днём, когда движок наконец-то полностью и окончательно отвязался от брашей в качестве основного и определяющего строительного материала!
Отныне XashNT переходит из разряда брашевых движков семейства Quake, в семейство современных полигональных движков
Как это определяется? Очень просто. В брашевом движке вы не сможете построить уровень только из моделей, вам обязательно понадобится хотя бы небесная коробка, ну или что-то вроде этого. К тому же при таком подходе у вас не будет просчитана видимость. В XashNT теперь можно полноценно считать видимость без использования брашей, полноценно работает коллизия и накладываются лайтмапы. Тем не менее я не планирую полностью избавляться от брашей по двум соображениям:
1. Поддержка классических брашевых уровней из старых игр. Это останется по прежнему доступно, более того - XashNT будет собирать такие уровни гораздо лучше и точнее чем оригинальные компиляторы тех игр. Но есть и другая интересная возможность. Как вы знаете эти уровни довольно плохо поддаются декомпиляции обратно в браши (зависит от формата BSP). Так вот, теперь есть возможность сдампить эти уровни в полигональную модель и скомпилить обратно под XashNT. Единственное что потребуется от моделлёра - это расставить порталы для обеспечения видимости. Впрочем их потребуется расставить в любом случае. Так что этот кейс сохраняет одно из важных направлений для любителей возиться со старыми играми и поэтому я не могу его просто взять и выбросить.
2. Несмотря на то, что XashNT умеет обходиться полностью без брашей, они ему всё же нужны. Для трёх важных случаев:
- Без брашей не будут работать триггеры. Вернее будут, но не слишком чётко. Могут срабатывать через раз, зависит от протяжённости триггера и места его пересечения другим примитивом. Полигональный движок коллизии может весьма точно определить момент пересечения двух тел, но нет абсолютно никакой возможности точно определить - продолжает ли тело застревать "в текстуре" или уже освободилось. Именно поэтому вы и наблюдаете чертопляску когда код антизастревания пытается вытолкнуть объект из текстуры. Потому что пересечения определяются по пересечению рёбер, а это происходит далеко не всегда. Это не ограничение XashNT это ограничение любого полигонального детектора коллизии. Решения этой проблемы не существует в принципе.
Точнее существует - в виде брашей, т.е. конвексных замкнутых примитивов
- Так же без брашей и по той же причине будут не очень хорошо работать всякие давилки, типа дверей, поездов и прочего. Хотя могу сказать, что в принципе этот момент в будущем скорее всего будет успешно исправлен. Ну просто потому что поездам не надо проникать в игрока, в отличие от триггеров. Просто на данный момент используется старый код детектирования коллизии из Quake (естественно в кодобазе на Shot, не в движке).
- Водяные объемы. Ну тут всё просто - нахождение предмета в воде определяется по результату возврата функции POINT_CONTENTS, а контентсы можно считать только и исключительно для объема. Если в первыми двумя пунктами ещё есть вероятность, что я это дело разрулю и исправлю, то здесь без вариантов. Вода будет работать только и исключительно с брашами. Если в движке нету брашей, там соответственно нет и никакой воды. Либо вода есть - но фейковая, как в Сталкере. Либо вода есть, но глобальная на всю карту и задаётся через гигантскую плоскость, как в Кризисе. А вот чтобы делать какую угодно воду, как в Quake - тут без брашей не обойтись.
Вроде как в любом физическом движке есть замкнутые коллайдеры для триггеров? Причём и трассу ими можно делать, там коробкой, сферой или капсулой. А вот для полигонов уже мешколайдер. Так что в целом это и всё и без брашей может работать даже для полигональной геометрии как в Юнити.
Но если делать по заветам Кармака, то да придётся писать целую систему. В Юнити кстати проваливания я крайне редко замечал, в основном только в тех случаях когда объект имел какое то неадекватное ускорение.
Да и не сказал бы я то что брашевая коллизия в целом стабильнее полигональной, я когда занимался переводом моделей в браши и пытался компилировать промежуточные результаты в бсп, замечал то что прекрасно обрабатывалось на полигональных движках, жутко обсиралось на брашевых - игрок проваливался под карту практически на ровном месте, в основном я как понял большой вклад в эту нестабильность вносили разбиения геометрии на более мелкие фрагменты, чего у полигональных движков нет.
Ещё я помню очень давно когда я делал карту на конкурс по хл, был случай когда на ровном месте появлялась невидимая и непроходимая плоскость.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!