Добавлен reALien,
опубликован
Раздел:
Моделлинг
Дьявол кроется в мелочах — гласит старая поговорка. Со временем я понял, что к моделлингу это тоже применительно. Есть ряд таких незаметных, казалось бы, незначительных приёмов, известных любому опытному моделлеру, но которые новичку узнать решительно неоткуда, кроме как изобрести самому. О таких полезных мелочах я и хотел бы сегодня поговорить.
Внимание: для того, чтобы усвоить изложенное здесь у вас уже должны быть базовые навыки моделлера!
Обращение нормалей при построении геометрии
На форуме часто можно встретить вопрос «Что делать если в mdlvis модель отображается нормально, а в War3ME и игре — как скопище рваных квадратов?», и чаще всего советую поставить галочку “Two sided” в материале. Это, конечно, отчасти решит проблему, но тогда вы получите неравномерно освещенные поверхности модели, что не есть хорошо. Бороться с этим я предлагаю следующим образом:
- Ещё перед тем, как начать строить геометрию в mdlvis'е, откройте модель в War3ME, и убедитесь, что галочка “Two sided” у материала будущего геосета не стоит.
- После этого вам нужно редактировать модель в mdlvis 1.40 да-да, 1.39 прорисовывает геометрию не так, как есть на самом деле.
- Когда сшиваете вершины треугольниками в vis'e, нужно смотреть на получаемую поверхность с того ракурса, который будет виден в результате.
- Если вы видите треугольник, который получается при нажатии на кнопку, то все ок.
- Если нет — тогда, не снимая выделения с только что связанных вершин, нажмите «Обратить нормали», и всё сразу станет на свои места.
Таким образом, создавая геометрию в mdlvis, вы сразу будете получать равномерно, правильно освещённые поверхности.
Примечание: этот способ работы с нормалями — единственный, который оставляет возможность открывать модель в War3ME без канонизации.
Ещё примечание: если вы делаете геометрию в 3DS Max или любом другом стороннем редакторе, то нормали в полученных моделях уже будут обёрнуты в нужных направлениях.
Альтернативный метод
Спасибо Iron'у, за то что подсказал мне такой вариант.
Есть и другой способ борьбы с неправильным освещением, о нем тоже стоит сказать. Здесь важен порядок, в котором вы выделяете вершины для соединения в треугольник, звучит не очень понятно, давайте разберемся на примере:
Опять же таки, вам понадобится mdlvis версии 1.40
- Допустим, вы выделяли вершины, двигаясь против часовой стрелки, тогда треугольник будет повернут в вашу сторону и все ок.
- Если же вы попробуете выделить вершины в порядке по часовой стрелке, тогда полигон будет повернут от вас и вы его попросту не увидите.
Вывод: если не хотите каждый раз при неправильном обороте треугольника жать "Обернуть нормали", то просто выделяйте вершины в нужном порядке.
Использование односторонности материала
Многие моделлеры просто тыкают у всех слоёв в материале галочку ”Two sided”; так, конечно, проще, но если действовать с этой функцией разумнее, то можно добиться интересных эффектов.
- Посмотрите, у меня есть простейшая модель — плоский квадрат. Один материал, с двумя слоями — красный цвет команды и синий цвет команды.
- Обратите внимание, как модель выглядит, если у всех слоёв стоит “Two sided”, она целиком синяя.
- Теперь давайте уберем её у верхнего слоя и посмотрим на результат. Вуаля, мы получили плоскость, которая с одной стороны красная, а с другой — синяя.
- Таким образом можно получать интересные эффекты без лишней траты полигонов.
Примечание: неплохим примером такого эффекта я считаю зонтик своего исполнения, у которого черное покрытие и красная подкладка, при том что это одна поверхность.
Имитация полупрозрачных материалов
Не знаю, кто придумал это прием, но одновременно у нас и на HiveWorkshop'е стали появляться модели, использующие его. Суть очень проста:
- Возьмем любую модель в моем случае — просто куб с уже наложенной текстурой.
- Открываем в mdlvis'е, выделяем нужные вершины, копируем и вставляем в ту же точку, а затем увеличиваем масштаб только что вставленных на 10 например, можете поэкспериментировать со значением % и выносим их в новую поверхность. Сохраняем и выходим из виза, он нам больше не понадобится.
- Открываем модель в War3ME. Создаем новый материал с той же текстурой что и у геосета, который мы редактировали, только “Filter mode” ставим на “Additive”.
- Назначаем новой поверхности только что созданный материал и любуемся на результат.
- Под конец я решил поменять текстуру, т.к. изначальная смотрелась не очень. =)
Примечание: лучше всего так получаются имитации кристаллов или стеклянных изделий (лампочек с гирлянды, например), но можно изобразить и водную гладь, и что-нибудь ещё - использование ограничивает лишь ваша фантазия.
Ещё примечание: можно так же делать больше двух повторяющихся поверхностей для большего эффекта.
И еще примечание: отличным примером такого приема может послужить модель кристального дракона, созданная Пиначетом.
Имитация блеска
Есть способ очень просто изобразить блеск воды, металла, чего угодно, в принципе:
- Возьмём уже имеющуюся поверхность, которой нужно придать блеск.
- Открываем модель в War3ME, находим нужный материал.
- Создаём новый слой с той же текстурой, но режимом фильтрации ”Additive”.
- Готово. Теперь поверхность отсвечивает на освещенных местах.
Примечание: стоит заметить, что если оставить оба слоя в материале затеняемыми, то эффект будет лучше.
Имитация бликов
Хотя в движке Warcraft'а для нас не предусмотрено никаких шейдеров, все же можно сделать нечто похожее на игру света, выглядит это примерно так:
- Возьмем модель с уже готовой разверткой и материалами
- Откроем её в War3ME и добавим из mpq-браузера текстуру “War3.mpq\Textures\Dust3_Thunder.blp”.
- Создаем глобальную анимацию длиной 3000 кадров можно любое другое число, на ваш вкус.
- Создаем анимацию текстуры, указываем в ней ранее созданную глобальную анимацию, тип интерполяции - “linear” и вставляем в текстовое поле следующие цифры:
0: { 0, -1, 0 }
1500: { 0, 1, 0 }
- Выбираем нужный материал и добавляем в него новый слой, ставим текстуру Dust3_Thunder.blp, режим фильтрации “addititve” и id анимированной текстуры на только что созданную нами.
В результате получаем некое подобие пробегающих бликов.
Примечание: советую посмотреть стандартную модель “War3.mpq\Abilities\Spells\Undead\FreezingBreath\FreezingBreathMissile.mdx”, в ней реализован такой прием.
Еще примечание: мой пример, конечно, довольно примитивен, можно поэкспериментировать с текстурой, сделать движение не в глобальной, а в каждой анимации отдельно, в зависимости от движения и т.д.
Крашеные поверхности
У нас уже есть статья о том, как сделать тимколор, имея текстуру с альфаканалом; но, как оказалось, можно обойтись простой текстурой в светлых тонах. Все как при создании тимколора:
- Мы создаем в текстурах ReplaceableID 1 и добавляем его в нижний слой материала.
- А вот с самой текстурой все немного не так. У её слоя нужно выставить фильтрацию “Modulate”.
- Вуаля, у меня получился крашеный металл.
Примечание: так можно поступать с любой текстурой, которая близится к черно-белой гамме, например с текстурой стандартного скелета (можно делать золотые черепа и т. д.).
Ещё примечание: рекомендую посмотреть модель библиария авторства IronMaiden'а, в ней широко задействован этот прием.
Черный источник частиц
Как я недавно узнал, у некоторых такая задача вызывает проблемы. Дело в том, что стандартные ресурсы мало приспособлены для создания источников частиц чисто черного цвета. Ведь большинство подходящих частиц не имеют альфа канала и рассчитаны для использования с фильтрацией “Additive”, а она превращает именно черный цвет в прозрачность.
Поэтому , что бы создать партикл эммитер чисто черного цвета вам нужно следующее:
Поэтому , что бы создать партикл эммитер чисто черного цвета вам нужно следующее:
- Для начала вам нужна текстура, имеющая альфа-канал, проблема в том, что наиболее часто используемые всяческие Clouds8x8 и Dust альфа-канала не имеют. Подойдет, например “War3.mpq\Textures\Sparkle_Anim.blp”.
- Когда создаёте, собственно, источник, вам нельзя использовать никакие типы фильтрации кроме ”Blend” и ”Transperent”, т.к. только они используют исходную прозрачность текстуры.
Примечание: присмотритесь также на досуге к текстуре “War3.mpq\Textures\Sparkle_Anim.blp”, из неё можно сделать массу интересных вещей, например высококачественные брызги крови или классный феерверк, на что только вашей фантазии хватит.
В заключение
Вот и всё, о чем я хотел бы вам рассказать. Несомненно, есть и другие приемы работы, о которых я даже не догадываюсь, они узнаются с опытом работы и, может быть, скоро вы придумаете свой и расскажете мне).
Хочу только сказать: не бойтесь экспериментировать, придумывать свои приемы и решения, ведь моделлинг — тоже своего рода искусство и без импровизации в нем никуда.
Творческих вам успехов и до новых встреч.
Хочу только сказать: не бойтесь экспериментировать, придумывать свои приемы и решения, ведь моделлинг — тоже своего рода искусство и без импровизации в нем никуда.
Творческих вам успехов и до новых встреч.
P.S. К статье прилагаю архив с моделями-примерами реализации приемов, которые я описал.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Если две точки уже есть, то третья, по сути и определит, в какую сторону ты двигался
Т.е. сохрани модель в mdl и найди секцию вершин любого геосета, они идут столбиком в порядке их создания (там триады координат, каждая триада - вершина). Теперь ситуация такая, ты в мдлвисе выделяешь рамочкой три вершины. Что же делает мдлвис в данном случае (ну т.е. как бы я это реализовывал), он просто бежит по всему списку точек активного геосета и проверяет, находится ли очередная точка в области выделения (фактически в прямоугольном цилиндре) по своим координатам. И если точка находится в области выделения, то мдлвис добавляет её в конец списка выделенных точек.
Получается, что нельзя определить порядок выделения точек при выделении рамкой, так как этот порядок зависит от расположения выделенных точек в списке точек геосета, а этого списка моделлер не видит.
PS: Суть то в чем, для управления лицевой стороной за счет порядка выделения вершин Алексею не пришлось писать совершенно никакого дополнительного кода. Он просто заталкивает выделяемые вершины в очередь в том порядке, в котором ты их выделяешь, а когда ты жмешь "создать треугольник", то мдлвис только лишь проверяет, чтобы длина этой очереди была равна трем, и тут же, без всяких отслеживаний по часовой ты выделил или против часовой, просто сразу же выбрасывает содержимое очереди выделенных вершин в список вершин полигонов модели. Т.е. на самом деле на то выделяешь ли ты по часовой или против часовой, вообще никто не смотрит в момент создания треугольника, просто уже в процессе отрисовки Direct3d и OpenGL смотрят на порядок расположения вершин в векторе, задающем множество полигонов геосета. Тут близзы тоже ребята ушлые, на самом деле в mdx этот вектор хранится чуть ли не в явном виде, остается только подставить координаты вместо номеров веришин и можно сразу же кидать на отрисовку. Ладно, это я уже глубоко полез. Тебе достаточно понимать, что порядок выделения вершин сработает на любой версии, потому что это не "фишка" введенная в какой-то версии, это вообще не "фишка".
Способ reALien'а пригодится в том случаи, когда моделлер использует в MDLvis'е функцию "Обратить нормали" на большом массиве полигонов (делается это при создании симметричных вещей используя ф-цию "Отразить вершины в рабочей плоскости")... всем известно, что Вис обязательно парочку треугольников да и не "обратит"...
А то, что предложил Iron пригодится при создании объекта из точек...
по поводу порядка выделения вершин - в математике всегда движение против часовой стрелки считается движением в положительную сторону, так что ничего удивительного
Хммм, сейчас придумал еще одну фишку, как сделать блик ну прям ну очень реалистичный, т.е. вплоть до скольжения по поверхности во время перемещения объекта или камеры. Сделаю наработочку и выложу. Возможно даже статью напишу.