WarCraft 3: Полезные мелочи в работе моделлера

» Раздел: Моделлинг

Дьявол кроется в мелочах — гласит старая поговорка. Со временем я понял, что к моделлингу это тоже применительно. Есть ряд таких незаметных, казалось бы, незначительных приёмов, известных любому опытному моделлеру, но которые новичку узнать решительно неоткуда, кроме как изобрести самому. О таких полезных мелочах я и хотел бы сегодня поговорить.
Внимание: для того, чтобы усвоить изложенное здесь у вас уже должны быть базовые навыки моделлера!

Обращение нормалей при построении геометрии

На форуме часто можно встретить вопрос «Что делать если в mdlvis модель отображается нормально, а в War3ME и игре — как скопище рваных квадратов?», и чаще всего советую поставить галочку “Two sided” в материале. Это, конечно, отчасти решит проблему, но тогда вы получите неравномерно освещенные поверхности модели, что не есть хорошо. Бороться с этим я предлагаю следующим образом:
  1. Ещё перед тем, как начать строить геометрию в mdlvis'е, откройте модель в War3ME, и убедитесь, что галочка “Two sided” у материала будущего геосета не стоит.
  1. После этого вам нужно редактировать модель в mdlvis 1.40 да-да, 1.39 прорисовывает геометрию не так, как есть на самом деле.
  1. Когда сшиваете вершины треугольниками в vis'e, нужно смотреть на получаемую поверхность с того ракурса, который будет виден в результате.
  1. Если вы видите треугольник, который получается при нажатии на кнопку, то все ок.
  1. Если нет — тогда, не снимая выделения с только что связанных вершин, нажмите «Обратить нормали», и всё сразу станет на свои места.
Таким образом, создавая геометрию в mdlvis, вы сразу будете получать равномерно, правильно освещённые поверхности.
Примечание: этот способ работы с нормалями — единственный, который оставляет возможность открывать модель в War3ME без канонизации.
Ещё примечание: если вы делаете геометрию в 3DS Max или любом другом стороннем редакторе, то нормали в полученных моделях уже будут обёрнуты в нужных направлениях.

Альтернативный метод

Спасибо Iron'у, за то что подсказал мне такой вариант.
Есть и другой способ борьбы с неправильным освещением, о нем тоже стоит сказать. Здесь важен порядок, в котором вы выделяете вершины для соединения в треугольник, звучит не очень понятно, давайте разберемся на примере:
Опять же таки, вам понадобится mdlvis версии 1.40
  1. Допустим, вы выделяли вершины, двигаясь против часовой стрелки, тогда треугольник будет повернут в вашу сторону и все ок.
  1. Если же вы попробуете выделить вершины в порядке по часовой стрелке, тогда полигон будет повернут от вас и вы его попросту не увидите.
Вывод: если не хотите каждый раз при неправильном обороте треугольника жать "Обернуть нормали", то просто выделяйте вершины в нужном порядке.

Использование односторонности материала

Многие моделлеры просто тыкают у всех слоёв в материале галочку ”Two sided”; так, конечно, проще, но если действовать с этой функцией разумнее, то можно добиться интересных эффектов.
  1. Посмотрите, у меня есть простейшая модель — плоский квадрат. Один материал, с двумя слоями — красный цвет команды и синий цвет команды.
  1. Обратите внимание, как модель выглядит, если у всех слоёв стоит “Two sided”, она целиком синяя.
  1. Теперь давайте уберем её у верхнего слоя и посмотрим на результат. Вуаля, мы получили плоскость, которая с одной стороны красная, а с другой — синяя.
  1. Таким образом можно получать интересные эффекты без лишней траты полигонов.
Примечание: неплохим примером такого эффекта я считаю зонтик своего исполнения, у которого черное покрытие и красная подкладка, при том что это одна поверхность.

Имитация полупрозрачных материалов

Не знаю, кто придумал это прием, но одновременно у нас и на HiveWorkshop'е стали появляться модели, использующие его. Суть очень проста:
  1. Возьмем любую модель в моем случае — просто куб с уже наложенной текстурой.
  1. Открываем в mdlvis'е, выделяем нужные вершины, копируем и вставляем в ту же точку, а затем увеличиваем масштаб только что вставленных на 10 например, можете поэкспериментировать со значением % и выносим их в новую поверхность. Сохраняем и выходим из виза, он нам больше не понадобится.
  1. Открываем модель в War3ME. Создаем новый материал с той же текстурой что и у геосета, который мы редактировали, только “Filter mode” ставим на “Additive”.
  1. Назначаем новой поверхности только что созданный материал и любуемся на результат.
  1. Под конец я решил поменять текстуру, т.к. изначальная смотрелась не очень. =)
Примечание: лучше всего так получаются имитации кристаллов или стеклянных изделий (лампочек с гирлянды, например), но можно изобразить и водную гладь, и что-нибудь ещё - использование ограничивает лишь ваша фантазия.
Ещё примечание: можно так же делать больше двух повторяющихся поверхностей для большего эффекта.
И еще примечание: отличным примером такого приема может послужить модель кристального дракона, созданная Пиначетом.

Имитация блеска

Есть способ очень просто изобразить блеск воды, металла, чего угодно, в принципе:
  1. Возьмём уже имеющуюся поверхность, которой нужно придать блеск.
  1. Открываем модель в War3ME, находим нужный материал.
  1. Создаём новый слой с той же текстурой, но режимом фильтрации ”Additive”.
  1. Готово. Теперь поверхность отсвечивает на освещенных местах.
Примечание: стоит заметить, что если оставить оба слоя в материале затеняемыми, то эффект будет лучше.

Имитация бликов

Хотя в движке Warcraft'а для нас не предусмотрено никаких шейдеров, все же можно сделать нечто похожее на игру света, выглядит это примерно так:
  1. Возьмем модель с уже готовой разверткой и материалами
  1. Откроем её в War3ME и добавим из mpq-браузера текстуру “War3.mpq\Textures\Dust3_Thunder.blp”.
  1. Создаем глобальную анимацию длиной 3000 кадров можно любое другое число, на ваш вкус.
  1. Создаем анимацию текстуры, указываем в ней ранее созданную глобальную анимацию, тип интерполяции - “linear” и вставляем в текстовое поле следующие цифры:
0: { 0, -1, 0 }
1500: { 0, 1, 0 }
  1. Выбираем нужный материал и добавляем в него новый слой, ставим текстуру Dust3_Thunder.blp, режим фильтрации “addititve” и id анимированной текстуры на только что созданную нами.
В результате получаем некое подобие пробегающих бликов.
Примечание: советую посмотреть стандартную модель “War3.mpq\Abilities\Spells\Undead\FreezingBreath\FreezingBreathMissile.mdx”, в ней реализован такой прием.
Еще примечание: мой пример, конечно, довольно примитивен, можно поэкспериментировать с текстурой, сделать движение не в глобальной, а в каждой анимации отдельно, в зависимости от движения и т.д.

Крашеные поверхности

У нас уже есть статья о том, как сделать тимколор, имея текстуру с альфаканалом; но, как оказалось, можно обойтись простой текстурой в светлых тонах. Все как при создании тимколора:
  1. Мы создаем в текстурах ReplaceableID 1 и добавляем его в нижний слой материала.
  1. А вот с самой текстурой все немного не так. У её слоя нужно выставить фильтрацию “Modulate”.
  1. Вуаля, у меня получился крашеный металл.
Примечание: так можно поступать с любой текстурой, которая близится к черно-белой гамме, например с текстурой стандартного скелета (можно делать золотые черепа и т. д.).
Ещё примечание: рекомендую посмотреть модель библиария авторства IronMaiden'а, в ней широко задействован этот прием.

Черный источник частиц

Как я недавно узнал, у некоторых такая задача вызывает проблемы. Дело в том, что стандартные ресурсы мало приспособлены для создания источников частиц чисто черного цвета. Ведь большинство подходящих частиц не имеют альфа канала и рассчитаны для использования с фильтрацией “Additive”, а она превращает именно черный цвет в прозрачность.
Поэтому , что бы создать партикл эммитер чисто черного цвета вам нужно следующее:
  1. Для начала вам нужна текстура, имеющая альфа-канал, проблема в том, что наиболее часто используемые всяческие Clouds8x8 и Dust альфа-канала не имеют. Подойдет, например “War3.mpq\Textures\Sparkle_Anim.blp”.
  1. Когда создаёте, собственно, источник, вам нельзя использовать никакие типы фильтрации кроме ”Blend” и ”Transperent”, т.к. только они используют исходную прозрачность текстуры.
Примечание: присмотритесь также на досуге к текстуре “War3.mpq\Textures\Sparkle_Anim.blp”, из неё можно сделать массу интересных вещей, например высококачественные брызги крови или классный феерверк, на что только вашей фантазии хватит.

В заключение

Вот и всё, о чем я хотел бы вам рассказать. Несомненно, есть и другие приемы работы, о которых я даже не догадываюсь, они узнаются с опытом работы и, может быть, скоро вы придумаете свой и расскажете мне).
Хочу только сказать: не бойтесь экспериментировать, придумывать свои приемы и решения, ведь моделлинг — тоже своего рода искусство и без импровизации в нем никуда.
Творческих вам успехов и до новых встреч.
P.S. К статье прилагаю архив с моделями-примерами реализации приемов, которые я описал.

Просмотров: 10 809

» Лучшие комментарии


VetsaN #1 - 7 лет назад 3
Полезная статья, жаль, что я сам до этого доходил. В базу.
AiDSeller #2 - 7 лет назад 1
Первое больше всего оказалось мне полезным. Долго ломал голову, как бы убрать эти треугольники.
Действительно, хорошая статья.
ShamaN26 #3 - 7 лет назад 0
да статья гуд, жаль мне приходилось всё это решать методом Тыка=)
XimikS #4 - 7 лет назад 0
за подробные скриншоты вбазу <3
Rewenger #5 - 7 лет назад 0
Думаю, никто не будет против, если я её опубликую. Кроме того, немного исправил грамматические ошибки.
reALien #6 - 7 лет назад 0
Внезапно ^^
ScorpioT1000 #7 - 7 лет назад 0
молодец <3 сам давно хотел сделать
Tornak #8 - 7 лет назад 0
Первое полезно ваще! Ток лучше бы написали класных статей о создании моделей для нубасов, тогдв бы стоко не клянчили моделек.
KaZimiRyaK #9 - 7 лет назад 0
полезная статья, много нового узнал, сегодняже испытаю)))
MasterDum #10 - 7 лет назад 0
reALien, давай так же про 3д макс,блендер и тп.
жаль этой статьи раньше не было.так бы время сэкономило бы.
Iron #11 - 7 лет назад 0
"3. Когда сшиваете вершины треугольниками в vis'e, нужно смотреть на получаемую поверхность с того ракурса, который будет виден в результате."
3.14здеж. Просто нужно выделять вершины против часовой стрелки относительно той стороны, в которую должна быть направлена поверхность. Т.е. выделение типа:
3-2
|/
1
даст нам поверхность направленную на нас.
а выделение:
1-2
|/
3
даст поверхность направленную от нас.
Знание этого позволяет экономить сотни времени, не вращать лишний раз камеру и не заниматься онанизмом, "инвертируя нормали".
PS: На самом деле это все напрямую связано с процессом отрисовки модели, в секции вершин полигонов файла модели вершины распологяются именно в том порядке, в котором вы их выделяете, и, соответственно, так же будут считаны интерпретатором варкрафта, и точно так же будут им переданы на отрисовку в Direct3d или OGL (в зависимости от настроек), и вот как раз Direct3d или OGL будет считать лицевой именно ту сторону, которая задается порядком ввода вершин против часовой стрелки. А направление нормалей совершенно не влияет на "лицевую" сторону поверхности. Попробуй развернуть нормали при помощи того же 40-го мдлвиса просто их вращая - лицевая сторона не изменится.
truth troll #12 - 7 лет назад 1
reALien, гуд статья... даже несколько вещей не знал... =) но это просто твой практический навык... "Если хочешь накормить человека, дай ему удочку, а не рыбу" =))) Это я к тому, что лучше бы ты рассказал подробнее о свойствах матерьялов, анимации поверхности, партиклах и ленточных источниках... А в пример привести эти приёмы... Тогда статья была бы исчерпывающей...
Iron,
Попробуй развернуть нормали при помощи того же 40-го мдлвиса просто их вращая - лицевая сторона не изменится.
В МДЛвисе при редакции геометрии (F1) материал односторонних поверхностей отображается двусторонними... (причина этому сам МДЛвис...) Переключившись на редактирование анимаций (F3) можно увидеть триугольники у которых нормали направлены в не ту сторону...
А то, что треугольники надо создавать против часовой, это тру... тогда нормали направлены в лицевую сторону...
И ещё на счёт нормалей... вот результат моего небольшого эксперимента по вращению нормалей в разных плоскостях... думаю все очевидно...
ZiDI #13 - 7 лет назад 0
Тру статья, мне поможет!
Сказочник #14 - 7 лет назад 0
Про полупрозрачные материалы я давно знал, а вот про блеск пригодится... А металлический блеск сымитировать этим можно?
А, вижу.
reALien #15 - 7 лет назад 0
Метод айрона протещу, если не прав, то впишу, ибо сам не знал О_О
Блеск да. любого материала выходит, лезвие меча например.
Ок, проверил, ты прав, но я еще бы поспорил, что больший геморой - быстро выделять вершины рамкой и в случае чего кликать борот, или все время тыкать по одной следя за нужным порядком.
Так что оставлю оба варианта (апдейт отправил на аппрув)
Сказочник #16 - 7 лет назад 0
Есть еще один вариант выделения точек - можно выделить три точки одновременно, если между ними есть треугольник (можно снять одну, затем выделить свободную - будут три точки без треугольника). Как при этом строится закономерность, кто-нибудь знает?
reALien #17 - 7 лет назад 0
Одновременно не сможешь, рамка их выделяет тоже в определенном порядке.
Если две точки уже есть, то третья, по сути и определит, в какую сторону ты двигался
shadow93 #18 - 7 лет назад 0
Мда... многое из этого я уже забыл) надо как нибудь модель сделать, как говорится вспомнить молодость ))
Iron #19 - 7 лет назад 0
Сказочник, ну я не думаю что Алексей заморачивался с оптимальными алгоритмами поиска и т.п. Т.е. скорее всего, они будут выделены в том порядке, в котором они перечислены в памяти, и тут тоже даю 98% вероятность того, что в памяти они размещены в том же порядке, что и в модели.
Т.е. сохрани модель в mdl и найди секцию вершин любого геосета, они идут столбиком в порядке их создания (там триады координат, каждая триада - вершина). Теперь ситуация такая, ты в мдлвисе выделяешь рамочкой три вершины. Что же делает мдлвис в данном случае (ну т.е. как бы я это реализовывал), он просто бежит по всему списку точек активного геосета и проверяет, находится ли очередная точка в области выделения (фактически в прямоугольном цилиндре) по своим координатам. И если точка находится в области выделения, то мдлвис добавляет её в конец списка выделенных точек.
Получается, что нельзя определить порядок выделения точек при выделении рамкой, так как этот порядок зависит от расположения выделенных точек в списке точек геосета, а этого списка моделлер не видит.
reALien, в часть где описывается создание полигонов добавь еще, что mdlvis отображает видимую сторону материала в редакторе геометрии только в режиме Вид -> Поверхность (кнопка S), а то народ будет смотреть в режиме текстурирования и видеть twosided или извращаться как truth troll, постоянно переходя в редактор анимаций.
И убери вот эту вот строку: "Опять же таки, вам понадобится mdlvis версии 1.40". Принцип порядка выделения вершин работает с самых бородатых версий. Тут, кстати, налицо большой плюс в сравнении с твоим методом, можешь хоть в версии 1.21 делать геометрию, и если будешь выделять вершины так как надо (а это не сложно, привыкаешь очень быстро), то все будет пучком.
PS: Суть то в чем, для управления лицевой стороной за счет порядка выделения вершин Алексею не пришлось писать совершенно никакого дополнительного кода. Он просто заталкивает выделяемые вершины в очередь в том порядке, в котором ты их выделяешь, а когда ты жмешь "создать треугольник", то мдлвис только лишь проверяет, чтобы длина этой очереди была равна трем, и тут же, без всяких отслеживаний по часовой ты выделил или против часовой, просто сразу же выбрасывает содержимое очереди выделенных вершин в список вершин полигонов модели. Т.е. на самом деле на то выделяешь ли ты по часовой или против часовой, вообще никто не смотрит в момент создания треугольника, просто уже в процессе отрисовки Direct3d и OpenGL смотрят на порядок расположения вершин в векторе, задающем множество полигонов геосета. Тут близзы тоже ребята ушлые, на самом деле в mdx этот вектор хранится чуть ли не в явном виде, остается только подставить координаты вместо номеров веришин и можно сразу же кидать на отрисовку. Ладно, это я уже глубоко полез. Тебе достаточно понимать, что порядок выделения вершин сработает на любой версии, потому что это не "фишка" введенная в какой-то версии, это вообще не "фишка".
reALien #20 - 7 лет назад 0
Да, вот только не дай тебе бог ошибится, и не заметишь ты этого в любой другой версии
truth troll #21 - 7 лет назад 0
Iron,
что mdlvis отображает видимую сторону материала в редакторе геометрии только в режиме Вид -> Поверхность (кнопка S)
Хм... как это я сразу не догадался так делать... =( но у меня проблем с этим нет...
По сути дела, оба описанных способа одинаково полезны...
Способ reALien'а пригодится в том случаи, когда моделлер использует в MDLvis'е функцию "Обратить нормали" на большом массиве полигонов (делается это при создании симметричных вещей используя ф-цию "Отразить вершины в рабочей плоскости")... всем известно, что Вис обязательно парочку треугольников да и не "обратит"...
А то, что предложил Iron пригодится при создании объекта из точек...
Wulfrein #22 - 7 лет назад 0
статья зачот
по поводу порядка выделения вершин - в математике всегда движение против часовой стрелки считается движением в положительную сторону, так что ничего удивительного
Iron #23 - 7 лет назад 0
Вот вам пример/наработка, как можно делать статические блики. Тут, конечно, много ограничений в использовании есть, но при правильном месте произростания рук может быть неплохо применено.
reALien, заметишь и в 1.39с в режиме "Поверхность". Так что убирай строку, а то даешь вредный совет новичкам, в плане лишний раз использовать левую версию мдлвиса. Учитывая что между 1.39с и 1.40 Алексей перерабатывал алгоритм сохранения/загрузки моделей, то лишний раз открывать/сохранять в разных версиях я бы не рекомендовал.
Хммм, сейчас придумал еще одну фишку, как сделать блик ну прям ну очень реалистичный, т.е. вплоть до скольжения по поверхности во время перемещения объекта или камеры. Сделаю наработочку и выложу. Возможно даже статью напишу.