Я думаю можно провести эксперимент. Если будет меш с нормальной развёрткой. Было бы интересно пособирать карту чисто из моделей с -nocsg, как минимум загрузить оригинальный меш спонзы, вот только как быть с детектором дырок? Компилятор же видит модели просто как точечный объект? В общем не очень понятна какая должна быть система миграции геометрии .map -> csg -> .obj -> .bsp? Хотелось бы увидеть твоё видение как это всё должно работать. В целом .obj если не ошибаюсь поддерживает объекты, можно прямо в 3д пакете расставлять лампочки и энтитии, вот правда я не очень понимаю в каком виде у них хранятся свойства.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro писал:
В целом .obj если не ошибаюсь поддерживает объекты
Да, поддерживает.
Цитата:
FiEctro писал:
можно прямо в 3д пакете расставлять лампочки и энтитии, вот правда я не очень понимаю в каком виде у них хранятся свойства
С этим засада. Я пытался найти популярный формат геометрии, который бы хранил заданные пользователем ключ-значения для объектов, но без толку. Даже коллада их не держит.
Но с другой-то стороны, энтити с ключ-значениями можно прекрасно писать в .map и использовать его в паре с OBJ.
Добавлено 14-07-2020 в 15:15:
Цитата:
FiEctro писал:
как быть с детектором дырок
Дырка обнаруживается очень просто. Каждое ребро должно принадлежать ровно двум полигонам с одинаковым winding-ом. Если для какого-либо ребра это несправедливо, то всё, у тебя дырка.
FiEctro nemyax
Зачем скрещивать ежа с ужом, если можно использовать каждый софт для того, что он делает хорошо? 3д-пакет - для редактирования геометрии, а игровой редактор - для расстановки лампочек и энтить.
Government-Man
Затем, что в триде-редакторе имеются средства для привязки и автопривязки энтитей к конкретной геометрии. И тебе не надо скакать между хорошо делающими свою работу софтами, чтобы туда-сюда подгонять.
FiEctro писал: Было бы интересно пособирать карту чисто из моделей с -nocsg, как минимум загрузить оригинальный меш спонзы
CSG работает только для брашей, на модели не влияет.
Цитата:
FiEctro писал: вот только как быть с детектором дырок?
Ну если у меша спонзы нет щелей, то нету и дырок. Я правда не знаю, будет ли вам охота подгонять всё точно, моделлеры в этом довольно небрежны.
С другой стороны - нет необходимости это проделывать для каждого полигончика, надо только отделить детайлы от структуралов. Ну это и через материал можно. Для построения дерева и детектирования дырок брашы не нужны, они оперируют точно такими же полигонами, ну да, желательно выпуклыми.
Цитата:
FiEctro писал: Компилятор же видит модели просто как точечный объект?
Смотря какой. NT-шный грузит модель, достаёт треугольники и встраивает их в карту, прямо в дерево. И режет на зоны-порталы.
Цитата:
FiEctro писал: Хотелось бы увидеть твоё видение как это всё должно работать.
я блендер не знаю. Поэтому и спрашиваю совета у товарищей.
Цитата:
nemyax писал: Каждое ребро должно принадлежать ровно двум полигонам с одинаковым winding-ом.
да ну глупости какие. Дырка будет, если в этом месте портал не создастся.
Точнее говоря изначальный портал дырку закроет, но потом его чем-нибудь порежет.
Цитата:
nemyax писал: Я пытался найти популярный формат геометрии, который бы хранил заданные пользователем ключ-значения для объектов, но без толку.
Ищи, вроде бы не такое уж сложное требование. Даже странно.
Добавлено 14-07-2020 в 16:27:
Корочи, ну её нахрен эту трипланарную проекцию, так толку не будет.
Посмотрел как в сталкере сделано.
У них там очень простая и эффективная замута под странным названием Orbitrary Oriented Ortho - Projection
найди где мы опечтались, что называется. Впрочем в сталкере такого хватает, там к примеру есть класс Menager.
Так вот, суть алгоритма - берём все фейсы соседей, добавляем их в одну группу (Deflector в терминологии сталкера). Ну это и так понятно, это то, что я вообще сделал в первую очередь, еще для трипланарной проекции.
Далее, находим самый здоровый полигон и от него начинаем добавлять в группу дефлектора, начиная именно с него. Понятно почему, чтобы в новой проекции все мелкие фейсы прилепились вокруг большого и не сильно искажали финальный размер куска лайтмапы.
При добавлении, нам надо следить за тем, чтобы атлас не замкнулся сам на себя, поскольку, как вы понимаете, геометрия может быть замкнутая, а лайтмапа нет, это же получилась бы бесконечная лайтмапа.
Это тоже очень просто - делаем дот между соседями, смотрим, чтобы там угол не превышал некоего глобального значения, наверное где-то в настройках компиляции. Ну понятно, чтобы атлас не завернулся сам на себя.
Теперь как матрица строится. Очень просто. Сумма нормалей всех треугольников (несглаженных), умножается на 1.0 + FLT_EPSILON * TriArea. Типа чтобы регулировать вклад нормали в зависимости от площади треугольника.
Дальше от полученной нормали (она кстати может и не получиться, всякое бывает), строим ортогональный базис, ну типа MakeNormalVectors и обычную ModelView через LookAt. И всё! Теперь мы нашей матрицей каждый вертекс трансформируем и используем его x,y как координаты лайтмапы.
>> я блендер не знаю. Поэтому и спрашиваю совета у товарищей.
Это скорее .obj, впрочем если хочешь какой то другой фомат, там .blend или .fbx говори, сохраню их.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Дядя Миша писал: При добавлении, нам надо следить за тем, чтобы атлас не замкнулся сам на себя, поскольку, как вы понимаете, геометрия может быть замкнутая, а лайтмапа нет, это же получилась бы бесконечная лайтмапа.
По приколу замкнутый атлас раскрыть как зонтик, чтобы получилось кольцо, и спроецировать на квадраную лайтмапу.
Цитата:
Дядя Миша писал: Кстати да, в сталкере Instant Radiosity, как и в халфе. А вы думали, чего на статике такая приятная картинка.
Она приятная уже потому что Radiosity или конкретно потому что Instant? Как кстати они избегают комбинаторного взрыва на открытых картах?
Crystallize писал: Как кстати они избегают комбинаторного взрыва на открытых картах?
Для солнца вопрос некорректный, там GI вообще по другому работает, в том числе и в халфе. ~50% лучей все равно уходят обратно в небо. Т.е. нам же не надо замащивать патчами небесную коробку, так что по сути никакого взрыва там и нету. Но оптимизация есть, очень простая, примерно такая же как в халфе- радиус, в который попадают все источники, свет считается только от них. В халфе-то по PVS, т.е. более корректно это было. Ну для открытых пространств пофигу обычно.
Теперь, когда я объяснил, как там лайтмапы проецируются, у вас наверняка остался самый важный вопрос - ну ок, построили мы там эту проекцию рассчитали UV и толку? Как нам теперь найти точки в 3D, соответствующие нашей проекции? Вопрос нихрена не праздный, т.к. пространство свёрнуто (в смысле одно измерение убрали) и реконструировать его обратно не получится ни через какую матрицу. Можно конечно действовать напрямую - с определённым шагом в 3д опять расставлять точки на треугольнике и трансформировать их в пространство люкселя, но такой подход скорее всего даст неравномерную лайтмапу либо какие-то разрывы.
Поэтому используется всё же обратный способ преобразования.
Берётся итератор лайтмапы по width\height. Для получившихся uv барицентрически считается попадание в треугольник. Ну там скорее всего с небольшими бордюрчиками, чтобы не попасть по шву. И вот если он у нас попал, мы просто барицентрик UVW преобразуем в WorldSpace - у нас же треугольник, это готовая матрица фактически, для преобразования туда-обратно. И вот у нас уже сразу есть абсолютно валидная позиция для сбора прямого света, аналогично барицентрически считается и нормаль. А результаты сбора идут сразу в люксель.
И всё, никакой чертовни с подгонкой этих ворлд позиций на валидные места, никаких трасс, ни-че-го. И с этой точки сразу зовём GatherSampleLight или как он у них там называется LightPoint, неважно.
Но кстати, в сталкере нет светящихся поверхностей. Там только солнце, поинтлайты и виртуальные вторичные источники.
Добавлено 14-07-2020 в 18:37:
Кстати еще один любопытный момент - для каждого треугольника потом отдельно рендерятся эджы. Но я хз зачем это, может из-за джиттера в основном проходе?
Добавлено 14-07-2020 в 18:41:
И бардюры там есть по дефолту, видать для бикубической фильтрацыы.
Добавлено 14-07-2020 в 18:43:
Лайтмайппер в двух режимах работает. Либо классические RGB-люксели, либо полусферы пишет. Второе, я так понимаю, для освещения персов.
Так что не удивлюсь, если в движке увижу лукап в лайтмапу.
Добавлено 14-07-2020 в 18:44:
Да, еще вот какой момент - я смотрю сорцы Open X-Ray, не оригинальные.
Мож там энтузазисты чего-то попереписывали.
Добавлено 14-07-2020 в 18:45:
Хотя, стоп, полусферы, это жы для Bent Normals. Для реалтаймового GI.
Добавлено 14-07-2020 в 18:58:
Да, я ж собственно за процесс маппинга сказать хотел, но чёт увлёкся.
Вообщем какой я вариант предлагаю, надеюсь это приемлимо.
1. кубаем в блендере целую команту с произвольной архитектурой, ну или не комнату, а зал, ландшафт, корочи сектор. Дальше ставим этот сектор на карту через какой-нибудь misc_model, окружаем скайбоксом, прорезаем в скайбоксе дырдочку-выход из сектора, туда лепим ареапортал.
2. Повторяем пункт 1, совмещаем оба сектора в пространстве через этот портал. Есть вариант, накубать сразу всю карту, а потом разделить целую геометрию порталами. Есть вариант эти брашы вокруг модели сгенерить автоматически, но тогда из такого помещения не будет выхода.
Есть вариант полностью отказаться от брашей, но это очень неудобно, потому что брашами хорошо задавать объем сложной формы - воду, триггеры. Собсно, для этого они по большей части и нужны. Ну и примитивную невидимую геометрию для генерации порталов. Но это уже по желанию.
Добавлено 14-07-2020 в 18:59:
ЗЫ. я как-нибудь попробую построить BSP без брашей, для триангл-модели, типа той же спонзы, посмотрю, будут ли утечки.
Добавлено 14-07-2020 в 21:23:
Из серии "это любопытно". В сталкере по дефолту четыре люкселя на метр.
В халфе - люксель на каждые 36 сантиметров, т.е. втрое выше.
Правда тут непонятно, это на квадратный метр. Если да, тогда всё наоборот.
>> Есть вариант полностью отказаться от брашей, но это очень неудобно, потому что брашами хорошо задавать объем сложной формы - воду, триггеры. Собсно, для этого они по большей части и нужны. Ну и примитивную невидимую геометрию для генерации порталов. Но это уже по желанию.
Можно в самом движке сделать xash.exe -editmode где ты просто загружаешь модель или map файл на проект сцены ( scene.xsh например ), и задаёшь объектам которые уже расставлены в 3д редакторе параметры прямо в этом моде, там же ты сразу можешь протестировать поведение твоих дверей, триггеров и т.д. , расставить лампочки, монстров, инфоплеер старт и теже самые триггеры. Задать дерево объектов парент системы, подцепить скрипты и т.д.
Пишешь в консоли buildmap *mapname*, движок сворачивается, запускает компилятор который компилирует всё это дело в bsp, запускает движок и включает твою карту уже в игровом режиме. Вроде как примерно так анрил энджин и работает.
В случае с map можно ещё и импортировать сразу значения этих объектов. И те кто любят кубать по старинке, ничего не надо будет делать дополнительно, они просто загружают карту на сцену и компилируют. Только у них ещё появится возможность протестировать все энтитии прямо в движке не компилируя карту. И здесь ещё один плюс! Можно будет редактировать эти объекты на уже откомпилированной чужой карте без исходников, либо вообще загрузить любую другую карту из первой халфы или кваки как меш, импортировать объекты и заново скомпилить под новый движок!
Для очень мелких дырок кстати можно сделать fill gaps чтобы их компилятор автоматически затыкал. Странно что в халфовских компиляторах этого так и не сделали.
Так же и главное меню игры можно сделать отдельным БСП с заскриптованными кнопочками и камерой.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!