1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Darkplaces 3.1 (terrain tutorial)

Автор: id0 · 2 май 2025 · ·
Поскольку во всём интернете я не нашёл толкового гайда по террейну в darkplaces, решил запилить сам, чтобы кому-то было менее больно, чем мне.
  1. Не, ну конечно по 3-ей кваке есть различные туториалы, но все они на английском, устарели, и не охватывают darkplaces, в котором, разумеется, свои приколюхи. Итак...

    Мне не особо нужны террэйновские просторы, но небольшой кусочек земли всегда пригодится. В самом первом уровне у меня, например, должно быть что-то вроде пустыни, откуда мы перемещаемся в город. Поначалу я сделал террейн патчем (patch). Объясняю, для тех, кто в танке: в первом Quake не было никаких патчей, всё было сделано брашами (brush).

    brush.jpg

    Что это такое, и в чём разница? Brush - это цельный куб из которых состоит любой кваковский (хальфлайфовский, анриловский, они использовались повсеместно) уровень. И даже если кажется, что в первом Quake на уровне сложная геометрия, то это только кажется - всё там состоит из этих кубиков. Они могут быть какой угодно формы, но всегда это примитивы. Более того, уровень должен быть закрыт полностью этими брашами, чтобы не было дырок (leak), иначе он просто не скомпилится. Зачем все эти сложности?

    А просто браши компилятся так, чтобы отрезать геометрию за собой, ту, которую не видно. Это называется occlusion - оптимизация уровня. И если вы думаете, то на современных машинах это не нужно, подумайте ещё раз. Одна только неоптимизированная трава на уровне съела у меня около 1000 fps. Поэтому terrain лучше делать тоже брашами.

    Патчи-же появились впервые в Quake 3 (кажется?), и это просто геометрия с которой удобно работать (флаги, трубы, арки, и т.д.). Патчами удобно наводить красоты, они сглаживаются по умолчанию, и они могут быть сколько угодно дырявые - это декоративные элементы, они ничего не оптимизируют, и если сделать террейн патчем, то он будет рендериться отовсюду, полностью, если в кадре будет хоть кусочек, и разумеется сам не будет ничего за собой скрывать. Это не страшно, если это небольшой террейн, скажем в помещении, но проблема очевидна.

    Итак, будем делать terrain как полагается. К слову, есть множество способов его сделать, и необязательно даже прибегать к сторонним утилитам, ведь по сути любой террейн - это тот же набор кубиков, и при желании его можно собрать прямо в редакторе. Так и делают иногда, если это скажем скала, и изголяться особо не надо, но целый большой террейн лучше генерировать где-то отдельно. Я использовал старинную прогу EasyGen.

    Качаем EasyGen отсюда, и распаковываем. При запуске она попросит указать путь к игре и текстурам, и лучше бы это сделать. Поскольку у нас речь о darkplaces, путь будет выглядеть как-то так:

    easy1.jpg
    textures.jpg

    Дальше всё очень просто, выбираем на палитре цвет (абсолютно любой), подгружаем нужную текстуру, рисуем на террейне с помощью Shift+Ctrl+Lclick (лучше не смешивать три текстуры вместе - возникнут артефакты). Я не буду описывать все тонкости, туториал не про это, если что, то вот гайд по EasyGen на английском. Прога старая и не очень удобная, зато супер простая, ничего лишнего, чистый функционал. На всякий, вот тут можно посмотреть все горячие клавиши:

    hotss.jpg

    Итак мы создали наш супер-пупер террейн, и очень собой гордимся. Теперь нужно экспортировать его в игру. Однако тут есть нюансы. У меня лично не получилось вставить террейн в существующий уровень, хотя такая возможность предусмотрена. Он не сломался, не заглючил, нет, но террейн там просто не появился, и вообще, хрен знает, работает эта возможность или нет. Вместо этого я создал новый уровень (всё равно многие редакторы поддерживают копипаст между уровнями, так что это не проблема). Рекомендую сразу поставить галочку Insert into a skybox, это создаст закрытый уровень с небом, чтобы лишний раз не гемороиться. Также можно сразу поставить игрока на карту с помощью Add an info_player_start

    exportu.jpg

    Экспортируем карту в папку maps в нашем моде.

    Итак уровень создан, и можно открыть его в редакторе. Я использую NetRadiant-custom. До этого пользовался TrenchBroom и хочу сказать что он очень удобный. Все остальные эти радианты тащат за собой болячки 30-летней давности. К сожалению TrenchBroom не поддерживает патчи. Уровень Q3 он может открыть, но с патчами ничего нельзя сделать, они просто подгружаются как объекты. Поэтому NetRadiant-custom. Открываем уровень и если всё сделано правильно, видим примерно такое:

    editor6.jpg

    Это в случае, если редактор уже настроен, и там прописаны все пути. Шейдер terrain который наложен на землю - стандартный, и с ним ничего не надо делать, EasyGen должен был прописать уже все необходимые пути. На обратой стороне terrainа должен уже стоять шейдер caulk - невидимый шейдер с работающим occlusion. Его не нужно трогать. Всё это должно работать по умолчанию, если редактор настроен как надо, но сейчас не о нём.

    Выделяем дальние полигоны с помощью Ctrl-Lclick и назначаем на них шейдер неба (подразумевается, что он у вас уже есть).

    Шейдер называется skies.shader и должен лежать в папке scripts.
    Текстуры тоже должны лежать там где написано. Про скайбокс отдельная песня, вот туториал, если что.

    //Название твоей текстуры
    textures/q3/sky4
    {
    //это как раз та текстура, которая назначается в радианте
    qer_editorimage textures/q3/sky4.tga

    //чтобы текстура неба не освещала сама себя
    q3map_backsplash 0 0
    //насколько хорошо текстура излучает свет - тут можно ставить довольно высокие значения
    q3map_lightsubdivide 2048
    //яркость свечения неба
    //q3map_surfacelight 1500

    q3map_skyLight 300 5
    q3map_lightmapFilterRadius 0 8

    //параметры солнца: первые 3 номера - цвет (RGB), четвертая цифра - яркость,
    //пятая - компас (север = 90 degrees, дальше, кажется, против часовой стрелки... 0, -90, 180 ),
    //шестая - высота (12 часов дня = 90 градусов, горизонт (закат = 0 градусов,
    //восход = 180 градусов (или наоборот)
    //q3map_sun 1 1 0.98 10 160 60

    surfaceparm sky //flags compiler that this is sky
    surfaceparm noimpact
    surfaceparm nomarks
    surfaceparm nolightmap
    surfaceparm nodlight

    nopicmip
    nomipmaps

    //параметры неба - эта строка объясняет игре, что текстуры для отображения скайбокса нужно
    //брать из папки /[mymapname]/[skyname] и читатьвсе файлы, начинающиеся на [skyname]*
    skyparms gfx/env/n2 - -
    }


    editor7.jpg

    Кстати NetRadiant-custom может показывать скайбокс прямо в редакторе. Клёвая возможность.

    Позже посмотрим на шейдеры подробнее, а пока можно выбрать кусок террейна и нажать N. Это откроет окошко объектов (entity). Экспортёр уже превратил весь террейн в объект func_group. Не волнуйтесь, так надо.

    Можно его выделить полностью, а пока - вот как он устроен. Как я и говорил - это просто набор примитивов:

    editor2.jpg

    Нажимаем кнопочку L или через меню выбираем EntityList. Это покажет все объекты в сцене. Тыркаем на func_group и террейн выделяется весь полностью. Этого можно и не делать, зато теперь вы узнали как это работает.

    editor3.jpg

    Теперь при выделенном террейне опять нажимаем N (окошко объектов) и добавляем строку _phong, и переменную 1. Нажимаем enter - строка должна появиться.

    alpha.jpg

    Честно говоря, я не знаю, фурычит это в формате Q3 или нет, но на всякий случай добавил. _phong добавляет сглаживание углов.

    Сохраняем карту и компилим. Вот, например мои параметры для q3map2:

    build.jpg

    или:

    [q3map2] -bsp -v -skyfix -custinfoparms -meta "[MapFile]"

    [q3map2] -vis -v -saveprt "[MapFile]"
    [q3map2] -light -custinfoparms -v -dark -shade -shadeangle 89 -sky 3 -fast -dirty -dirtmode 1 -dirtscale 3 -dirtdepth 128 -deluxe -deluxemode 0 -samples 2 -samplesize 32 -patchshadows -bounce 2 -bouncescale 5 -bouncegrid -gamma 3 -compensate 4 -threads 2 "[MapFile]"

    editor5.jpg

    Запускаем карту в нашей игре

    editor8.jpg

    и видим примерно такое:

    npc20250502203700-00.jpg

    Это в случае, если в шейдере неба прописано освещение. У меня прописано, это шейдер, который был выше. Если всё чёрное, можно просто вернуться в редактор и поставить тестовые лампочки самому.

    Ура!!! Все работает... ведь правда? Правда?...

    zzz.jpg

    Не спешите. Вот такие артефакты terrain выдаёт в darkplaces, если включить динамическое освещение, в моём случае фонарик:

    npc20250502203714-00.jpg npc20250502203724-00.jpg

    Это из за шейдера. EasyGen красавчик, он всё экпортировал правильно, и даже создал шейдер, в папке scripts, вот только это шейдер третьей кваки, и с тёмными местами дружит не особо. Заходим в папку scripts и ищем шейдер террейна, в моём случае это map01.shader, поскольку сохранённый файл карты в EasyGen так и назывался:

    map01.jpg

    Открываем файл любым текстовым редактором, я советую Notepad++ и смотрим. Там должно быть что то такое:

    textures/map01/terrain_0
    {
    surfaceparm nolightmap
    q3map_novertexshadows
    q3map_forcesunlight

    {
    map textures/terrain/ground_mud_01.jpg
    rgbGen vertex
    tcmod scale 0.125 0.125

    }
    }


    Удаляем строчки выделенные красным для всех блоков, заканчивающихся на простую цифру типа _0.
    Теперь меняем их, чтобы они выглядели вот так:

    textures/map01/terrain_0
    {
    q3map_nonplanar
    q3map_globalTexture
    q3map_shadeangle 179
    q3map_lightmapsamplesize 32
    q3map_lightmapaxis z
    q3map_lightmapBrightness 0.5
    q3map_lightmapsampleoffset 8.0
    q3map_tcGen ivector ( 384 0 0 ) ( 0 384 0 )

    {
    map textures/terrain/ground_mud_01.jpg
    }
    {
    map $lightmap
    blendFunc GL_DST_COLOR GL_ZERO
    tcGen lightmap
    }

    }


    По сути от старого блока осталось только название и путь к текстуре. Так и надо.

    Теперь то же самое с блоками, заканчивающимися на строки типа _0to1:

    Превращаем вот это:

    textures/map01/terrain_0to1
    {
    surfaceparm nolightmap
    q3map_novertexshadows
    q3map_forcesunlight

    {
    map textures/terrain/ground_mud_01.jpg
    rgbGen vertex
    alphaGen vertex
    tcmod scale 0.125 0.125

    }
    {
    map textures/terrain/ground_rocks_01.jpg
    rgbGen vertex
    alphaGen vertex
    tcmod scale 0.125 0.125
    blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA

    }
    }

    В это:

    textures/map01/terrain_0to1
    {
    q3map_nonplanar
    q3map_globalTexture
    q3map_shadeangle 179
    q3map_lightmapsamplesize 32
    q3map_lightmapaxis z
    q3map_lightmapBrightness 0.5
    q3map_lightmapsampleoffset 8.0
    q3map_tcGen ivector ( 384 0 0 ) ( 0 384 0 )

    {
    map textures/terrain/ground_mud_01.jpg
    }
    {
    map textures/terrain/ground_rocks_01.jpg
    alphaGen vertex
    blendFunc GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA
    }
    {
    map $lightmap
    blendFunc GL_DST_COLOR GL_ZERO
    tcGen lightmap
    }

    }

    Осторожно, не сотрите ненароком что нибудь нужное, типа второй текстуры. Последний блок

    textures/map01/terrain.vertex
    {
    surfaceparm nolightmap
    q3map_novertexshadows
    q3map_forcesunlight
    {
    map textures/terrain/ground_mud_01.jpg
    rgbGen vertex
    tcmod scale 0.125 0.125
    }
    }


    можно вообще закомментить, или стереть, не знаю зачем он нужен, разницы не заметил.

    Можно добавить к любому из начальных блоков такую строчку, где нибудь в начале:

    q3map_surfaceModel models/terrain/grass01.md3 24 0.025 1.5 3 1 122 1

    Это создаст детали на данной текстуре, в данном случае траву. Разумеется моделька должна лежать по указанному пути и быть в нужном расширении.

    Теперь сохраняем шейдер. Кстати, советую прописать его в файле shaderlist.txt, который лежит там-же, в папке scripts. Если не лежит, то создайте, и пропишите туда все файлы с расширением .shader, но без расширения, примерно так:

    common
    concrete
    dp_custom
    dfx_liquids
    ground
    map01
    metal
    skies
    water
    walls

    Не забудьте, если будете ещё шалить в EasyGen, сохранитe карту (в самом EasyGen) под другим названием, а то при экспорте ваш шейдер опять сломается!

    Итак, возвращаемся в редактор, и компилим всё по новой. Теперь всё должно выглядеть как-то так:

    npc20250502220302-00.jpg

    Уррра!!!
    Теперь всё точно получилось, и нет артефактов!

    113529_original.jpg

    Если-же нет, советую всё проверить и перепроверить, особенно шейдеры.

    Можно поиграться с настройками размера текстур (только смотрите, чтобы и текстуры были одного размера(между собой), и цифры были одинаковые у всех, однако это важно только если игра пиксельная, с текстурами в низком разрешении).

    Это строчка:
    q3map_tcGen ivector ( 384 0 0 ) ( 0 384 0 )

    И пошалить с размером и плотностью травы:
    //q3map_surfaceModel modelpath density odds minscale maxscale minangle maxangle oriented
    q3map_surfaceModel models/terrain/grass01.md3 24 0.025 1.5 3 1 122 1


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

    Всем бобра!
    ZaRR, Кишмиш, mcrstar и 7 другим нравится это.

Комментарии

  1. Кишмиш
    Атмосферно выглядит (когда не глючит).

    Насчет ку3, кстати, замучались с товарищем. Он в (современном, который 2.8 и выше) блендере сделал (смоделировал и заанимировал) плеермодел на ку3, и уже был готов радоваться от помещения ее в игру, но... суть в том, что все плагины экспорта мд3 в современном блендере работают неправильно, в итоге сколько мы не пытались вставлять модельку в игру, постоянно слетали tags нужные для соединения частей игрока, в итоге так ничего и не вышло. А переделывать под блендер 2.6/2.7 он отказывается, как и - разумеется - лезть в 3ds max 5 или, если ты @ZaRR ,в какой-нить MaverickModel3d...

    Я потом на гитхабе тыкал чьи-то попытки обновить экспортер под блендер 4.х, но там была то ли та же фигня, то ли оно ломалось на попытках экспорта сразу.

    При этом, суть в том что md3 сейчас больше популярен у любителей eduke32 или gzdoom чтоб вставлять статичные модельки, короче народа кому все еще интересно своего перса на ку3 сделать практически уже и нет, поэтому "и так сойдет" увы...

    Вот под etqw был вроде неплохой экспортер еще, но там своя система со скелеталкой, да и тоже забросили потом.
    1. Кишмиш
      А openarena вроде на iqm ушли (или это в Ксонотик? один фиг, документации практически нема, и playerbase don't care either), или там md5 у них, не помню. Помню что в ку3 as it is перегнать нельзя было)
    2. id0
      md3 лучше потому что, mdl-лвские вершины плавают, если делать какой нибудь хоррор или психодел - это очень клёво выглядит, ещё и можно отключить сглаживание анимации - вообще на пластилиновый мультфильм похоже :)
      Но если делать по человечески - это MD3. Для darkplaces вообще можно скелетную анимацию сделать в IQM, только зачем? Физики нет всё равно, рагдолл не сделаешь.
    3. id0
      Я к слову всё в Noesis экспортирую, сначала в FBX, а из Noesisa в md3 - всё работает отлично.
  2. ZaRR
    Отличный туториал! Я тоже давно как-то маппил под 3-й. Видос делал тоже на скорую руку, но на удивление и оно помогло многим.

    На этом нетрадианте тоже можно на ку1,2.

    А на trenchbroom маппил на kingpin и hexen 2 что-то мелкое.
      id0 нравится это.
    1. id0
      У меня, к сожалению не пашет ютуб.
  3. ZaRR
    @id0, неудачно отписался вам в лс.
    "Пользователь id0 не хочет, чтобы с ним вступали в личную переписку."
    Короче поискать в инете можно обход проги.
    1. id0
      А я не знаю где эти настройки сообщений, ничего не трогал. Щас погляжу...
Чтобы оставить комментарий просто зарегистрируйтесь и станьте участником!
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление