Список разделов » CG Новости » Making of (Eng)
Перевод урока "Создание Варга"
Автор: seaman | Вот
ЗЫ: выкладывать туда уроки несравнимо проще, чем на любой форум. Так что впредь буду выкладывать их туда, а Админ, если желает, может переносить на форум. |
Автор: Melentiev A | О, круть! А можешь его сюда перенести? |
Автор: seaman | Долго очень. Я с работы выхожу в инет - времени не очень много. Если будет время - перенесу. |
Автор: Melentiev A | seaman Спасибо! |
Автор: seaman | Создание Varga - Часть 1 - Моделирование 3D персонажа в майя с использованием карт нормалей. Программное обеспечение: майя Автор: Пол Тоска Вебсайт Автора: Это не урок шаг за шагом. Я суммирую процесс, который я использовал для одного из моих персонажей с большим количеством изображений и некоторых скриншотов непосредственно из используемых приложений (Maya/Mudbox/Photoshop, и т.д...), также, я дам некоторую информацию о картах нормали в пространстве касательных (tangent) , таким образом Вы можете думать об этом уроке прежде всего как об уроке о картах нормалей. 1. Введение Этот персонаж - мой вклад в конкурс проектирование игрового (low-poly) персонажа, с некоторыми ограничениями, которые мы могли использовать для геометрии, и текстур (основной персонаж не может превысить 6000 треугольников, еще 1000 треугольников для оружия/механизма, и мы могли также использовать домашнее животное, но бюджет будет исходить из основного персонажа; для текстур мы могли использовать 1x2048 квадрат для основного персонажа + домашнее животное, если таковые вообще имеются, и другой 1x1024 квадрат для механизма оружия / съемного механизма; были разрешены диффузная, зеркальная, нормали, бампа, непрозрачности, блеска карты отражения).
Этот урок предназначен для игровых (low-poly) персонажей и предполагает, что у Вас есть элементарные знания использования карт нормалей; Вы можете поискать на google, если Вы нуждаетесь в большем количестве информации об этой теме.
Я начну, показывая Вам конечные файлы, посланные на конкурс, чтобы дать Вам общее представление об идее что получится в конце урока.
Концепт: Конструкция : Текстуры : Прекрасный выстрел: Поза победителя : 2. Процесс моделирования для игры
В настоящее время почти все игры используют карты нормалей для игровых персонажей, даже ММОРПГ, таким образом hi-poly версия персонажа будет нужна, чтобы запечь нормали для low-poly версии. Карты нормалей могут быть сделаны без помощи версии модели с высоким разрешением, из бамп карт, даже раскрашенных вручную (позже я покажу Вам некоторые уловки, которые я использую, чтобы раскрашивать карты нормалей непосредственно в Фотошопе), хотя маловероятно, что Вы сможете достичь тех же самых результатов, какие дала бы hi-poly версия.
Для создания персонажа, наиболее вероятно будут нужны:
* low-poly версия (или несколько версий для разных LODs);
* hi-poly версия используемая для вычисления нормалей для low-poly (Вы могли также запечь карты окружения и другие карты, которые помогут Вам позже, при текстурировании... смотрите параграф "4.3. Перенос карт"
* все виды текстур, которые поддерживает игровой механизм (чаще всего используются диффуз, нормали, зеркальная). Я предполагаю, что концепт/рисунок доступен и что нужно сделать - моделирование/текстурирование.
Есть главным образом два подхода, которые Вы можете использовать, моделируя (различие между ними в порядке создания): * low-poly модель -> текстура диффуза -> hi-poly модель -> карта нормалей и другие текстуры;
* hi-poly модель -> low-poly модель -> нормальная карта-> текстура диффуза и другие текстуры.
Оба пути могут дать хорошие результаты если сделаны должным образом, и выбор будет главным образом зависеть от принятого процесса; я работал и так и так в прошлом, но предпочитаю последний подход.
Хотя у первого пути могло бы быть немного преимуществ (когда low-poly версия персонажей, будет готова ее можно передать аниматорам; или создание hi-poly версии будет более быстрым, если Вы будете работать тщательно и сохранять много версий в .psd файл диффуза, которые Вы можете позже использовать как карты смещения (displacements) на сетку с высоким разрешением), у него есть один большой недостаток, и я проиллюстрирую его в быстром примере.
Предположим, ниже - часть модели (рубашка с некоторыми кнопками)... Будем считать, что low-poly, и текстуры диффуза готовы...
Следующий шаг детализация low-poly версии. Я импортирую приведенную в порядок low- poly версию в Mudbox для детализации. Затем я также загружу диффузную текстуру, чтобы проверить, что детали, которые я добавлю, соотносятся правильно с диффузом... затем, я запущу добавление сабдивов/уровней и добавлю такие детали как сгибы и объем...
Я буду использовать карты высоты, сделанные из диффузной текстуры для смещения тонких деталей (это ускорит процесс, а также этим способом я удостоверюсь, что вычисленная карта нормалей будет точнее соответствовать диффузной, чем если бы я ваял непосредственно используя диффузную карту)...
Вы можете видеть, что подробности в диффузной с одной стороны и карте нормалей с другой не соотносятся правильно, это – из-за того, что во время ваяния больших сгибов, я переместил/сдвинул геометрию немного и хотя я использовал карты смещения, чтобы добавить такие подробности как кнопки, это не гарантирует, что когда будут рассчитываться подробности для карты нормалей они будут соответствовать диффузной. Чтобы избежать этого, hi-poly версия должна быть сделана с особой тщательностью, и если возможно, не делайте больших смещений от оригинальной сетки / low- poly версии..., но это значительно затрудняет Вам работу, в особенности при придании объема. Как побочное примечание: если Вы используете карты нормалей, вычисленные в пределах майя (с Инструментом Transfer Maps Tool ), и хотите выполнить визуализацию с mental ray в пределах майя, проверьте что включено Render Settings dialog -> mental ray tab->Translation->Performance. Вы, должны проверить Maya Derivatives (как в изображении ниже - отметьте, что эта опция по умолчанию выключена). Таким образом, Вы будете использовать Maya вычисление производных для бамп маппинга, совместимо с Майя для mental ray. Также отметьте, что эта опция только доступна, когда Export Polygon Derivatives включены. Второй подход моделирования: hi-poly => low-poly => UVs => текстуры, даст Вам свободу ваять и добавлять подробности с самого начала, и Вы будете также свободны от вышеизложенной проблемы.
Однако, моделируя hi-poly версию Вы должны иметь в виду, что она будет использоваться, чтобы запечь нормали для low-poly версии и моделировать ее соответственно.
Вы должны будете оценить, какие подробности стоит добавлять и будут ли они использоваться должным образом, вычисляя нормальную карту для low-poly версии. Например, если у меня есть hi -poly представленная ниже: Я могу вообще использовать всего один четырехугольный полигон, но результат не будет очень хорошо представлять hi -poly версию. Если посмотреть с этой точки зрения, то результат, кажется, выглядит неплохо: Но когда мы посмотрим под наклонным углом, то увидим, что один полигон плохо отображает подробности: Лучший подход - потратить немного больше полигонов, чтобы сделать low-poly более соответствующим hi -poly.
Тогда low-poly с картой нормалей будет выглядеть лучше когда рассматривается под наклонными углами. (конечно, в зависимости от бюджета полигонов Вы можете добавить больше геометрии, чтобы улучшить вид). Кроме того, Вы должны избегать моделировать сложные подробности формы, которые тяжело ограничить пределами low-poly, т.к они "съедают" слишком много полигонов, при попытке отобразить их должным образом. Хотя Вы можете испытать желание сойти с ума и добавить много деталей как показано ниже. Hi-poly модель может выглядеть хорошей, но выстраивая low -poly версию поверх нее, Вы должны будете всегда оставаться в пределах бюджета полигонов (5-10k треугольников) и если Вы не планировали hi-poly подробности заранее, то Вы могли бы оказаться перед ситуацией, где Вы будете нуждаться в большем количестве полигонов чем Вам было выделено, чтобы лучше соответствовать hi-poly модели, и Вы должны будете возвратиться и изменить hi -poly версию. Но с некоторой практикой Вы будете знать, какие подробности стоит включать в hi-poly версию а какие подробности опустить, потому что их сложно воспроизвести в low-poly. Другое большое преимущество второго подхода состоит в том, что Вы может также запечь карту ambient occlusion и другие карты (простую диффузную или specular ) используя детали hi-poly модели - и Вы можете использовать их как отправную точку для текстур. Также Вы можете попробовать комбинацию этих двух методов, которые показаны выше, фактически это - то, что я сделал для Varga, и я покажу Вам это позже в следующих параграфах. 3. Используемые Инструментальные средства Прежде, чем я начну показывать Вам процесс, которое я использовал для Varga, я суммирую инструментальные средства, которые я использовал для этого проекта. Сначала позвольте мне суммировать спецификации PC, на котором я работал, потому что большинство ограничений, с которыми я столкнулся, были аппаратными: * Athlon XP 2500 + @2400 (разгон не добавит многого на этой старой машине), * 1 Гбайт оперативной памяти * Видео GeForce 6600GT Вы можете вероятно предположить, что это не очень высокопроизводительная машина, и я был серьезно ограничен числом полигонов, которые я мог использовать одновременно (в Mudbox, я мог дойти до 2 миллионов треугольников, но тогда работа слишком замедляется), в майя, у меня было много сбоев, при попытке импортировать .obj файлы, больше чем 1.5 ml треугольников (недостаточно оперативной памяти), и я попытался разбить модель на части (голова, туловище, бедра, ноги, руки и т.д.) так, чтобы я мог работать с достаточно большим числом полигонов, чтобы ваять подробности, которые я желал, без разрушающихся или неуправляемых сцен (обычно, количество полигонов на кусок не будет превышать 1 ml треугольников). Относительно используемого программного обеспечения я - главным образом использовал майя, таким образом часть работы была сделана в майя (моделирование, UVs, прожиг текстуры). Для ваяния hi-poly я использовал Mudbox (строил low-poly в майя и экспортировал ее в Mudbox для дальнейшей детализации). После того, как часть ваяния была закончена, я экспортировал один из hi-poly уровней как.obj файл (обычно, 100-300k сетка треугольников работала прекрасная на данном этапе, без необходимости экспортировать самый высокий уровень), и импортировал это к Topogun, наряду с low-poly cеткой (если я ее уже имею, или в противном случае строю новую на пустом месте в пределах Topogun), и перестраиваю топологию, чтобы лучше соответствовать подробностям. Я добавляю hi-poly сетку. После того, как этот процесс был закончен, я импортирую low-poly и hi-poly версии назад в майя и вычисляю карты нормалей, используя Инструмент Transfer Maps Tool. Карты нормалей далее подстраиваются в Фотошопе; некоторые были сделаны полностью в Фотошопе (проверьте карты для лука Peril ниже). Теперь, когда я разделался со всей этой болтовней, позвольте мне показать Вам некоторые изображения WIP в следующем параграфе. 4. Процесс, используемый для Varga. Обычно для игровых персонажей у Вас будут некоторые спецификации, которым нужно следовать: ограничение на число треугольников, размер и число используемых текстур; Вы должны соответствовать числу/размеру текстур, но если Вы превышаете число треугольников на 500 – 1000 (скажем, для бюджета 8 КБ), и персонаж выглядит крутым, маловероятно, что клиент будет безумно рад. Для этого конкурса пределом были 6000 треугольников, и я не хотел превысить это, так что первый шаг был построить low-poly cетку, чтобы разделить полигоны между всеми объектами (основной персонаж, домашнее животное, оружие). Это не окончательный вариант, но это действительно позволяет мне видеть, какие подробности я могу включить в hi -poly версию. 4.1. Low-Poly сетка Ниже быстрая оценка первых low-poly версий (разбитая на треугольники - конечная версия). После того, как я смоделировал low-poly версию персонажа, я лучше осознал как распределить полигоны между основным персонажем, домашним животным и оружием/механизмом. Следующиим шагом нужно было разделить модель на части и зачистка их. Для того, чтобы ваять, лучше иметь чистую топологию, главным образом нужно иметь только четырехугольные полигоны - пытаться избегать треугольников и ситуаций, когда больше чем 4 полигона встретятся в одной вершине (добавьте дополнительное разбиение сетки, чтобы избавиться от всех нерегулярностей в ней; так у Вас будет больше предсказуемых результатов, при ваянии). Вы можете переместить треугольники и вершины, где больше чем 4 полигона соединятся в области, которые менее важны/видимы. Также Вы должны стремиться к топологии, у которой будут главным образом квадратные полигоны (избегайте полигонов, которые по одной оси имеют размер более чем в 2 раза больше чем по другой - добавьте дополнительные полигоны, чтобы устранить это... помните, что это все делается для hi-poly, таким образом количество полигонов не будет иметь значения). Ниже некоторые части, готовые быть импортированными в Mudbox и детализированными далее. 4.2. Детализация в Mudbox Следующий шаг импорт сетки в Mudbox и добавление такого количества деталей, как Вы или Ваша машина сможете выдержать... каждый может сломаться в конце концов…
Это - наиболее любимая часть для меня во всем процессе. Я покажу Вам изображения сделанные через некоторый промежуток времени. Ботинки (немного менее 1mil треугольников для самого высокого уровня) Бедра (1.6 mil треугольников для самого высокого уровня) Ноги (приблизительно 500 КБ треугольников для самого высокого уровня) Руки (приблизительно 600 КБ треугольников для самого высокого уровня) Туловище (приблизительно 800 КБ треугольников для самого высокого уровня) Ниже Вы можете видеть всю hi-poly модель в 8.5mil треугольников (мне удалось импортировать все части в майя для этого урока на моей новой машине, но майя съест для этого 3.5 Gb оперативной памяти). Теперь, когда забавная часть закончена, я возьму low -poly версию, которую я сделал в начале и изменю ее, чтобы соответствовать лучше hi-poly версии. Я использовал Topogun для этого - импортировал low -poly версию и одну из более hi-poly уровней как шаблон, изменил топологию чтобы low-poly наиболее точно соответствовала hi-poly версии, чтобы получить хорошие карты нормалей при прожиге карт. Я повторю тот же самый процесс для каждой части, которую я ваял отдельно и когда все будет сказано и сделано, я буду готов перейти в следующую стадию - прожиг карт нормалей.
4.3. Передача Карт
В этом точке low-poly версия и все hi-poly части готовы, и я продолжу работу с UV -разверткой.
Есть много средств для UVs, которые Вы можете использовать: UVLayout, Unfold 3D, плагины к программе для картирования кожи, и т.д..., и некоторые скажут, что каждый лучше чем другой, но я делаю всю свою UV-развертку с инструментальными средствами, встроенными в майя. Они могут потребовать большего внимания и планирования, где разрезать UVs и иногда будут производить раздробленные UVs, но после второй триальной версии вообще работают хорошо. Я попробовал Headus UVLayout и Unfold также, но мне нравится развертка в майе больше, потому что она работает быстрее.
Я не буду показывать Вам, как я работал над UVs, потому что много людей, которых я знаю, не использует майя для UV-маппинга и наиболее вероятно информация, которую я дам, будет избыточной.
Идея состоит в том, чтобы развернуть UVs с минимальным натяжением. Хорошая подсказка - располагайте Ваши швы в менее видимых частях модели (на руках и ногах, например, на их внутренней части), и также можно разбить развертку соответственно частям в hi-poly версии (например, ботинок пойдет как одна оболочка, каждая нога как одна оболочка, и т.д...),
После того, как UVs были закончены, я готов запечь нормали и другие карты по необходимости.
Я использовал Инструмент Transfer Maps в майя для этого (но рендер в текстуру в 3ds Макс работает аналогично).
Я буду иллюстрировать этот процесс на ботинке: Перед стартом, имейте в виду, что UVs на частях геометрии, для которых Вы собираетесь запечь нормали, не должны перекрываться (Вы можете допустить перекрытие на UVs для рук или других подобных объектов, но для точных результатов, переместите перекрывающиеся UVs вне 01 пространства или уменьшите их в углу или неиспользованном пространстве при прожиге).
- Импортируйте и low-poly и hi-poly версии в майя и удостоверьтесь, что они находятся в одной точке пространства.
- Откройте диалоговое окно Transfer Maps (в меню Rendering в Lighting/Shading-> Transfer maps ...)
- Выберите low -poly версию и в разделе Target Meshes нажмите Add Selected, затем выберите hi-poly и в разделе Source Meshes нажмите Add Selected (см. выше). (Если Вы не добавите какую-нибудь геометрию в Source Meshes, то Майя будет использовать всю геометрию в сцене). - В опциях отображения выберите Envelope (или Вы можете выбрать для отображения оба и Envelope и сетку). - Это создаст геометрию, которую можно редактировать (просто смещенную относительно low -poly версии) и которая будет использоваться как оболочка для поиска сетки-источника. Вы можете изменить смещение с помощью ползунка Search envelope (или просто ввести нужное значение). Идея в том, что Вы получите лучший результат, если Ваша hi-poly версия будет вся внутри оболочки (как на третьем рисунке ниже). - Но если Вы отодвинете оболочку слишком далеко, прожиг может начать работать неверно. Обычно я делаю несколько проб и ошибок, изменяя смещение, пока не получу большую часть hi-poly версии внутри оболочки. Затем выбираю оболочку и настраиваю вершины/плоигоны/ребра пока вся hi -poly версия не окажется внутри оболочки. - Выберите карты, которые Вы хотите запечь; я выбрал карту нормалей (Вы могли бы также запечь карты ambient occlusion ... таким образом Вы произведете выборку AO от hi-poly версии, но у меня не было слишком большого количества времени, чтобы вычислять карты AO также, потому что они требуют для расчета большего количества времени... в зависимости от Вашей машины, моя была слишком медленной для этого; вместо этого я использовал пакетный прожиг ментал-рея с картой нормалей, наложенной на low -poly, чтобы АО... работает намного быстрее с сопоставимыми результатами... см. позже для подробностей).
Кроме того, удостоверьтесь, что Вы указали путь, для сохранения файла, выбрали формат файла, размеры карты и другие подробности, как Вы хотите. Кроме того, убедитесь, что Вы установили метод поиска внутри оболочки только. - Теперь Вы готовы визуализировать текстуры и нажать кнопку Bake.
Примечание: удостоверьтесь, что Вы сохранили файл прежде, чем Вы нажмете кнопку Bake, потому что после рендеринга текстуры, майя удалит оболочку, а Вы, возможно, будете нуждаться в ней снова (особенно, если Вы провели некоторое время, настраивая ее, чтобы лучше включить hi -poly), или если Ваша карта не выглядит хорошо и должна быть повторно запечена. Конечно, Вы можете отменить несколько шагов, пока оболочка не появится снова, но более безопасно сохранение сцены.
- Если карта нормалей не выглядит хорошо с первого раза, возвратитесь снова к диалогу Transfer Maps и скорректируйте немного параметры настройки (но когда у Вас есть оболочка, которая полностью включает hi-poly версию, маловероятно, что будут проблемы. С другой стороны, у Вас будет некоторые проблемы, если оболочка пересечется с hi-poly..., если Вы слишком ленивы, чтобы подстроить оболочку, Вы могли бы установить метод поиска во " inside then outside (внутри – затем снаружи) " или в "closest to envelope (самый близкий к оболочке)"; есть ситуации, когда это хорошо работает и ситуации, когда у Вас будут проблемы: обычно у Вас будут проблемы, когда несколько поверхностей пересекутся на hi-poly версии. Скажем, те полоски на вершине рук, например... в этом случае, если оболочка пересекается с hi-poly геометрией также, то это можетбы произвести выборку неправильной поверхности.
Те же самые шаги выполняются в 3ds Макс: -Выберите low-poly сетку, пойдите в rendering -> render to texture.
- Проверьте projection mapping (включите его).
- Нажмите Pick и выберите hi-poly модель.
- После этого, Макс обычно создает сумасшедшую оболочку (автоматический процесс).
- Выберите модификатор проекции.
- Перейдите в свиток Cage и нажмите Сброс (Reset), чтобы сбросить клетку (клетка будет точно соответствовать low-poly).
- В свитке push Вы можете изменить Amount, чтобы сместить оболочку как в майя, так, чтобы попытаться включить hi-poly версию. - Также как в майя, Вы можете изменить клетку, разворачивая модификатор проекции и настраивая индивидуальные элементы, пока весь hi-poly не будет внутри оболочки.
- После того, как вся тонкая настройка сделана, выберите low-poly снова, и в диалоге Render to texture нажмите Render.
- Если карта не выглядит правильной, Вы можете еще подстроить оболочку.
Затем, я покажу Вам, другой дешевый способ вычислить АО, используя ментал рей и финальный сбор на карте нормали, наложенной на low-poly версию (это не будет выглядеть точно так же как АО, вычисленные по hi-poly версии, но будет намного быстрее).
Скажем, это - конечный low-poly с картой нормалей (я буду покрывать только ботинок, но Вы можете проделать те же самые шаги на всем персонаже сразу). Создайте большую плоскость и поместите ее под ботинок. Установите окружающий цвет фона для перспективного вида в белый (Этот цвет будет использоваться, когда лучи при финальном сборе не пересекают никакую геометрию). Установите визуализатор в ментал рей, проверьте, что Вы выбрали экспортер Maya Derivatives. Удостоверьтесь в Render Settings-> Common tab ->Render Options что у Вас опция Enable Default Light выключена, по умолчанию она включена (при этом майя не будет создавать заданный по умолчанию свет и передавать его ментал рей, если у Вас не будет ни одного установленного в сцене), и удалите или скройте все светильники в сценах.
Удостоверьтесь, что Вы включили Final Gathering (обычно, я устанавливаю Quality Preset в Production, и затем включаю FG и увеличиваю точность на 1000-1500 и оставляю другие опции в значениях по умолчанию). Назначьте новый материал Ламберта low-poly геометрии, установите цвет в чисто белый и диффуз в 1. (также примените те же самые опции для плоскости основания). Выберите материал, назначенный low-poly, и добавьте в канал Bump текстуру карты нормалей. Удостоверьтесь, что Вы установили пространство картирования bump в Tangent Space . Перед прожигом Вы можете сделать тестовую визуализацию с ментал рей и если все сделано верно Вы получите подобный результат. Затем, откройте диалог прожига, в меню Rendering под Lighting/Shading->Batch bake (mental ray) перейдите в опции и удостоверьтесь, что Вы включили, прожиг теней и ортогональное отражение, и также устанавливают другие опции также как на изображении ниже... установите тип файла и размер, и Вы готовы! Нажмите кнопку convert и если все установлено верно, Вы получите текстуру подобную моей.(Если Вы не можете найти текстуру можно просмотреть лог файл визуализатора, и если Вы не ввели путь для сохранения текстуры, Майя обычно сохраняет ее в текущем проекте в папке renderData/mentalray/lightMaps). Она не будет столь же четкой как АО, вычисленная непосредственно от hi-poly, но вычисляется намного быстрее. Используя тот же самый процесс, Вы можете запечь некоторые зеркальные текстуры. Сохраните ту же самую сцену с другим названием (spec_bake или подобно) и отключите FG в ментал рей; удалите плоскость основания. Измените материал, назначенный на low-poly на blinn, измените его цвет на черный, зеркальный цвет на белый и reflectivity на 0. Добавьте в сцену несколько направленных светильников и расположите их вокруг объекта сверху. Используя те же самые опции ментал рей, но он вычисляет теперь очень быстро (теперь он рассчитывает только зеркальный проход). Удвойте разрешающую способность при прожиге, и понизьте ее в Фотошопе. Вы достигнете лучших результатов с этим методом).
Вы должны получить текстуру как ниже, и Вы можете наложить ее на Вашу диффузную текстуру в режиме screen/color dodge blending (чтобы дать больше изменений)..., это работает лучше для пластмасс, металла, кожи или другие материалов, которые имеют высокое отражение (это выглядит не столь хорошо для ткани, например).
Достаточно разговоров о прожиге. Перейдем ко Второй части урока. Перевод Беляев Валерий ака seaman. |
Автор: seaman | 4.4. Тонкая настройка Карт Нормалей в Фотошопе Этот раздел для тех из Вас, кто хочет лучше понять карты нормалей. Это может казаться немного техническим (требуются некоторые элементарные знания математики, векторов и подобных вещей). 4.4.1. Некоторая Общая информация о TS (пространство касательных) Карт Нормалей Во-первых, я хотел бы говорить немного о картах нормалей, как они вычисляются/отображаются. Я больше интересуюсь картами нормалей пространства касательных (мировое пространство, или карты нормалей объектного пространства не являются подходящими для персонажей или для объектов, которые искажаются), так что, когда я говорю «карта нормалей», Вы можете предположить, что я говорю о пространстве касательных если не заявлено иначе. Если Вы будете в той же самой ситуации, как я был когда начал изучать карты нормалей (пространство касательных в особенности), то вероятно следующая информация поможет. Вначале я был действительно расстроен проблемой "Шва", где карта нормалей, вычисленная программой, не будет отображаться должным образом. О чем я говорю - о шве, который появится в геометрии, где у Вас есть граница UV-развертки. Основная проблема в способе, которым каждое приложение вычисляет/отображает карты нормали пространства касательных. Пространство касательных представлено тремя векторами: нормали (которая всегда будет перпендикулярен поверхности), два других вектора перпендикулярные к нормали, называются тангенсом и бинормалью (или касательная к двум точкам). Некоторые говорят, что правильное название будет «касательная к двум точкам», так как мы говорим о поверхности... для кривой в трехмерном пространстве касательных будут один тангенс и две нормали (нормаль и бинормаль). Для поверхностей у нас есть одна нормаль и два вектора тангенса (тангенс и касательная к двум точкам). Обозначение не имеет значения очень, пока мы знаем о чем мы говорим. Эти три вектора могут быть определены для каждой точки на поверхности и взяты все вместе, они определяют координаты формы. Обычно пространство касательных в треугольнике будет вычислено следующим образом: - вектор нормали всегда будет перпендикулярен поверхности (треугольнику); это будет синим и будет сохранено в синем канале карты нормали. - Тангенс (красный, сохраненный в красном канале) и бинормаль (зеленый,сохраненный в зеленом канале), векторы будут ориентированы в соответствии с UVs - тангенс будет слева направо (или справа налево) в UV пространстве, таким образом это будет координата U в пространстве текстуры; а бинормаль будет снизу вверх (или сверху вниз), таким образом это будет V координата в пространстве текстуры. Вероятно Вы видели во многих диалогах для карт нормали опции для отражения красного или зеленого канала. Эти опции переворачивают ориентацию тангенса (слева-направо/справо-налево) и бинормали (снизу-вверх/сверху-вниз), некоторые приложения используют ориентацию отличающуюся от других; Вы можете перевернуть каналы в Фотошопе, например чтобы первернуть красный канал нажимают Ctrl+1 (чтобы перейти в красный канал), и Ctrl+I (чтобы инвертировать ее), затем Ctrl + ~ (тилда, которая слева от клавиши «1»), чтобы возвратиться к полному изображению RGB (то же самое для зеленого Ctrl+2, Ctrl+I, Ctrl + ~). Предположим, что я разрезал UVs вдоль ребра и повернул одну часть на 90 градусов по часовой стрелке как в изображении ниже. Из-за вращения в UV пространстве пространство касательных для первого треугольника будет другим чем в первой ситуации (триада RGB для первого треугольника также повернулась на 90 градусов вокруг синей оси). В результате этого ориентация UV оболочек затронет цвета, которые Вы видите в карте нормалей; если Вы повернете UVs своей модели скажем на 90 градусов по часовой стрелке и повторно вычислять карту нормалей, то цвета в новой карте будут совсем другими (не потому что все изображение повернется на 90 градусов, Вы можете повернуть на эти 90 градусов каналы в Фотошопе и сравнить с новой версией карты нормалей, чтобы проверить - они будут различными). Пространство касательных вычисляется в вершинах, затем Вы можете вычислить векторы пространства касательных для любой произвольной точки на поверхности, интерполируя векторы пространства касательных вершин. Теперь для того, чтобы вычислить карту нормалей, raytracing алгоритм проводит луч от текущей точки low-poly к hi-poly и в пункте пересечения с ней вычисляет нормаль для hi-poly в мировом пространстве (WS). Затем эта нормаль преобразуется в пространство касательных (TS) low-poly версии и сохраняется в карте нормалей. Таким образом Вы видите, что вычисленная нормаль зависит от пространства касательных, используемого для low-poly версии, и карта нормали пространства касательных должна быть создана, используя ту же самую нормаль/тангенс/бинормаль? Которая будет использоваться игрой (или приложением, которое Вы используете, чтобы отобразить карту нормали), иначе нормали будут извращены, и Вы будете видеть неодонородности на границе Это не было бы проблемой, если бы различные приложения использовали различные методы для векторных вычислений пространства касательных. Проблема состоит в том, что они не делают эту информацию доступной так, чтобы кто-то мог написать дополнение к программе/инструменту, которое исправит проблему... единственное приложение, которое я знаю пока, открыло формулы - Mudbox, на их страницах интерактивной справки, Вы можете найти, как они вычисляют векторы пространства касательных.
Теперь Вы знаете, почему проблема происходит, этого мало, но, по крайней мере, Вы должны знать, что Вы не делаете чего - то не так, приложение виновато. Я покажу пример и объясню, как карта нормалей будет вычислена, и как интерпретируются каналы - это поможет, если Вы захотите изменить карты нормалей в Фотошопе, наложить несколько карт нормалей, подрисовать их непосредственно в Фотошопе и т.д... Я запеку нормали от плоскости и цилиндра ниже на единственный полигон, подсвеченный зеленым. Как я объяснил ранее, пространство касательных будет: нормаль (синий), тангенс слева направо (красный) и бинормаль снизу-вверх (зеленый). У цилиндра все полигоны несглажены, таким образом нормали изменятся пошагово, это будет проще проанализировать. Я нумеровал грани на цилиндре от 1 до 7. Теперь давайте предположим, что мы смотрим на объекты непосредственно в окне спереди, это будет выглядеть как в изображении ниже. Наверху изображения у Вас есть цветовая схема: hi-poly - белый, нормали для него являются голубыми, low-poly является сиреневым, нормали для него являются желтыми (так как у нас один полигон, у нормалей будет та же самая ориентация всюду на поверхности), Ниже цветовых кодов Вы видите TS (пространство касательных) триада: тангенс (красный слева направо), нормаль (синий вниз) и бинормаль (зеленый - перпендикулярный экрану, указывает от Вас в экран). Обратите внимание в фигуре выше этого, все грани от hi-poly версии параллельны с зеленой стрелкой (бинормаль в пространстве тангенса), исключая треугольники, которые в крышке цилиндра, и не будут видимы в карте нормалей. Теперь, для каждой грани в hi-poly, я могу проанализировать векторы нормалей (голубые на цветной маркировке), их тангенсы (красные на цветной маркировке) и нормали (синие на цветной маркировке), компонент бинормали будет нулем для всех их, так как грани параллельны с вектором бинормали = зеленая стрелка, следовательно одного цвета в зеленом канале карты нормали. Зеленые пунктирные линии были нарисованы, чтобы помочь визуализировать лучше переходы между гранями и видеть, как они соотносятся с фактической геометрией. Серые стрелки, указывающие от low-poly к hi-poly, являются лучами, используемыми во время вычисления карты нормали. Теперь давайте рассмотрим некоторые точки low-poly (A, B, C, D, E, F, G) и увидим то, что фактически происходит. Примечание: обычно векторы нормализованы (по модулю длины) и если Вы будете анализировать вектор в компонентах TS (или другой системы координат), то у каждого компонента будет реальное значение между -1 и 1. Однако, это будет преобразовано к позитивному целому числу и сохранено в каналы RGB нормальной карты следующим образом: - Для тангенса (в красном канале) отрицательные значения (-1,0) будут отображены линейно к 0-127, 0 будет 128 (нейтральный) а положительные значения (0,1), будет отображены линейно к 129-255. - То же самое будет с бинормалью в зеленом канале. - Для вектора нормали значения могут быть только положительны (0,1), таким образом они будут отображены к 128-255; большую часть времени нормаль hi-poly не будет отклоняться намного по сравнению с вектором нормали в TS для low-poly следовательно синяя компонента карт нормали в TS будет преобладать (синий канал будет главным образом белым); из-за этого карты нормалей TS могли бы быть сжаты, так как используют меньше цветов чем карты нормалей OS(объектного пространства)/WS (мирового пространства), также так как векторы TS не могут указать назад, компонент нормалей будет всегда позитивен, и когда нормализована она может быть закодирована, используя только тангенс, и бинормаль (нормаль будет вычислена основываясь на двух других). Для точки D, мы испускаем в луч и пересекая hi-poly версию, нормаль будет нормалью грани, номер 4, который будет параллельна с вектором нормали TS. Вы можете видеть, что красный канал будет 128, так как компонент тангенса будет нулем, и нормальный компонент будет 1 закодирован значением 255 (полный белый) в синем канале. Для точки F, ищущий луч пересечет грань номер 6, и мы можем видеть, что вектор нормали этой грани (голубой по цветной маркировке) будет отображаться в два компонента: компонент тангенса (красный) с положительным значением приблизительно 0.78 кодируется числом 228 в красном канале и компонент бинормали (синем) с положительным значением 0.625 закодированный значением 208 в синем канале. Для точки B, ищущий луч пересечет грань номер 2, и мы можем видеть, что вектор нормали этой грани будет отображаться в компонент тангенса (красный) с отрицательным значением приблизительно-0.78 закодированный значением приблизительно 22 в красном канале и компонент бинормали (синем) с положительным значением 0.625 закодированный значением 208 в синем канале. Между прочим, Вы можете видеть индивидуальные каналы в Фотошопе с ctrl+1, ctrl+2, ctrl+3 для красного зеленого цвета и синего цвета и ctrl + ~ для полного RGB. Вы можете скопировать их следующим образом: для красного-> ctrl+1 (переходим в красный канал), ctrl+a (выделяем все), ctrl+shift+c (копируем видимый канал), ctrl + ~ (переходим в полный RGB), и ctrl+v (вставляем скопированное), после этой комбинации быстрых клавиш, у Вас будет красный канал выбранного слоя вставлен как новый слой поверх остальных. Если я поверну цилиндр на 90 градусов как показано ниже: карта нормалей и ее отдельные каналы будут выглядеть так: На сей раз красный канал является однотонным со значением 128 (как был раньше зеленый канал), так как все грани в hi-poly теперь параллельны красной стрелке (и когда нормали будут анализироваться, компоненты тангенса будут нулем, отображенным к 12; зеленый канал (бинормаль) будет выглядеть подобным красному каналу прежде (но повернутым на 90 градусов), а синий канал выглядит также как прежде, но повернутым на 90 градусов. После того как мы узнали, как рассчитывается каждый канал, мы можем сделать следующую аналогию: - Я назначил материал Ламберта на hi-poly (цилиндр и плоскость), выбрал цвет - нейтральный полутон (128 128 12, установил накал в нейтральный полутон также (128 128 12 а также установил диффуз в 1 - Мы будем смотреть на цилиндр в окне просмотра сверху (орографическое представление): - Создайте нормальный направленный светильник с цветом полностью белым, и интенсивностью 1 расположенным справа (свет будет параллелен с экраном). - Создайте " sucker " направленный светильник, я не знаю, знакомы ли Вы с термином "светильник sucker "... Я видел что их так называют на некоторых форумах, и я назову их так же. Это - светильник с отрицательной интенсивностью. Такой светильник фактически вычтет / "отсосет (sucker)" свет, таким образом затемняя сцену. Довольно удобно, когда у Вас есть сверхзасветка в сцене, если Вы корректируете атрибуты для светильников уже находящихся в сцене. Этим путем Вы можете добавить светильник sucker устраняя проблему. Теперь добавьте светильник sucker с полностью белым цветом и интенсивностью -1 слева так чтобы он также светил параллельно экрану (таким образом оба светильника будут в плоскости бинормаль-тангенс). Если мы сравним скриншот окна просмотра майя и красный канал в вычисленной карте нормалей, то они выглядеть идентично. То же самое применимо к зеленому каналу, если Вы проверите его. На сей раз обычный светильник будет излучать сверху, а светильник sucker снизу (теперь оба светильника в бинормаль-тангенс). Для синего канала Вам нужно установить только обычный светильник, но на сей раз освещая прямо сверху (светильник параллелен вектору нормали в TS). Если я захочу увидеть все каналы вместе, мне нужно изменить цвет светильников, чтобы он воздействовал только на один канал. На рисунке ниже Вы видите все пять светильников. С помощью таких светильников Вы можете увидеть карту нормалей в реальном времени на виде сверху для любой геометрии. Теперь эта информация не будет слишком полезна, так как Вы все еще должны обработать геометрию..., но прочитайте следующий параграф..., Вы можете моделировать эту установку освещения в Фотошопе со стилями слоя и все, что Вы должны будете сделать - выделение. 4.4.2. Карты нормалей в Фотошопе Теперь я попытаюсь смоделировать в Фотошопе тот же самый эффект что показан выше со светильниками в майя, но на сей раз используя стили слоя. Я установил цвет фона в 128 128 255 Мне будут нужны 5 слоев, по одному для каждого светильника (сделайте 5 слоев и измените их непрозрачность на 0). Затем я сделаю выделение и заполню их в каждом слое, но только эффекты будут видимы. Для Красного обычного светильника, примените эффект как показано ниже (bevel и emboss), выключите использование глобального освещения, установите угол в 0 (светильник будет светить справа), установите высоту в 0 (свет параллелен экрану), highlight mode установите в цвет 255 128 128 (RGB), чтобы осветить только красный канал, и непрозрачность в 100 %, непрозрачность для теней в 0 (нам не нужны они). Для красного "sucker" светильника скопируйте и вставьте те же установки, затем измените угол на 180 (свет приходит слева) и измените цвет на 0 128 128, чтобы он вычитал свет/тень только из красного канала. Для обычного зеленого светильника все тоже самое, но угол 90 (свет идет сверху) и цвет 128 255 128 для освещения только зеленого канала. Для зеленого "sucker" все тоже самое, угол -90, цвет 128 0 128. И наконец для синего канала, примените эффект inner shadow, выключите глобальное освещение, расстояние в 0, choke в 0, установите размер в тот, что Вы вводили для размеров bevel and emboss и цвет в 255 255 128, чтобы затемнить только синий канал, непрозрачность в 100. Забавная часть - то, что теперь, когда у Вас есть стили слоя на месте, Вы можете только пойти и корректировать размер в пикселях для эффектов и поиграть со всеми другими атрибутами в bevel and emboss. Если Вы хотите "вырезать" детали, Вы только должны изменить напрвление в bevel and emboss от вверх на вниз для красных и зеленых стилей слоя, Вы можете размыть выделение с Гауссовой размытием, чтобы достигнуть более гладких результатов. Вы можете дублировать этот набор и изменить атрибуты снова и сделать все что Вы захотите. Вам решать как экспериментировать. Вы можете даже поместить набор слоев поверх других карт нормалей и это будет выглядеть хорошо (только примените фильтр NVIDIA для производства карт нормалей для нормализации конечной текстуры). Ниже я дурачился в течение нескольких минут, дублируя набор слоев, который я построил ранее, заполняя слои в наборе некоторыми выделениями и изменяя атрибуты для эффектов, нормали не на 100 % точны, как были бы сделаны с реальной геометрией (из-за рендеринга, сделанного bevel and emboss ). Но если Вы устанавливаете атрибуты соответственно, Вы можете едва лишь заметить это. Попробуйте сделать карту нормалей подобную этой геометрией за 15 минут. Я уверен – у Вас не выйдет Эта техника была использована для Peril (лука). С картой нормалей. Полностью текстурированный. Другая вещь, которую Вы можете сделать, наложить две карты нормалей в Фотошопе, я видел много людей, фактически устанавливающих режим смешивания слоев в overlay и называющих это окончательным. Это - не совсем хороший метод, и я покажу Вам почему в следующем изображении. Скажем, мы хотим наложить карту нормалей показанные внизу; Вы можете видеть, как синий канал выглядит для каждой карты и как должно выглядеть объединенное изображение. Но устанавливая режим для наложения, из за того что синий канал - почти белый, он полностью затрет любые детали в синем канале, и составная карта нормалей будет выглядеть неправильной. Ниже конечная комбинированная карта когда установлен режим наложения overlay; мы полностью вытираем информацию о нормальном компоненте, таким образом оверлейный режим для смешения является БОЛЬШИМ НЕТ НЕТ НЕТ Лучший способ объединить их состоит в том, чтобы заставить красные и зеленые каналы накладываться overlay, а синий канал умножаться... теперь, как я сделаю это? Хорошо, продублируйте второй слой (слой, который, как предполагалось будет установлен в режим overlay ), один слой будет установлен в режим overlay, другой в умножение. Теперь, для набора слоев в оверлее я должен нейтрализовать информацию в синем канале, выбирая нейтральный полутон (128 128 12 и заполняя синий канал этим цветом - который будет ctrl+3 (чтобы перейти в синий канал) и alt+backspace (чтобы заполнить его нейтральным серым, предполагая, что цвет FG будет 128 128 12, этот слой должен теперь быть похожим на этот когда рассматривается один. Для второго набора слоев, которые будут умножаться, я должен нейтрализовать красные и зеленые каналы (для этого заполнить их белым), так установите белый как цвет FG и ctrl+1 (чтобы перейти в красный канал) и alt+backspace, чтобы заполнить белым, то же самое для зеленого ctrl+2 и alt+backspace; второй слой должен быть похожим на изображение ниже когда рассматривается один. Ниже сравнение между этими двумя методами, очевидно комбинация overlay/умножение более верный способ. Если векторы, сохраненные в карте нормалей, будут нормализованы, то красного и зеленого каналов будет достаточно, потому что компонент нормали может быть вычислен из тангенса и бинормали а вычисление будет сделано при отображении. Если дело обстоит так тогда простой оверлей будет работать прекрасно, потому что информация в синем канале не будет использоваться, но большинство приложений используют также и синий канал, таким образом Вам нужно использовать комбинацию overlay/умножение. Конечно для примера выше Вы могли просто сделать выделение и наложить их обычным способом, но большую часть времени у Вас будут мелкие подробности в обеих картах, которые должны быть с наложены. Теперь, когда Вы знаете, как объединить карты нормалей, Вы вероятно спрашиваете, зачем Вам нужно делать это? Хорошо, я дам Вам некоторые примеры. После того, как Вы заканчиваете диффузные текстуры, Вы можете создать карту бампа с прекрасными деталями (поры в коже и другие детали кожи, ткани... и т.д), затем использовать фильтры NVIDIA, чтобы создать карту нормалей, которая будет смешана поверх карты нормалей, вычисленной от геометрии (этим способом, прекрасные детали от диффузной и карты нормалей совпадают правильно). Это может помочь Вам в других ситуациях также: Когда я ваял туловище для Varga, я забыл сваять шрам недостающей груди и позже когда я понял, что я имею некоторые проблемы со сценой и не мог решить их простым способом, я просто сваял шрам на новой плоскости и смешал его с остальными. Также, когда я ваял Тень, я пошел слишком далеко с числом полигонов и позже понял, что я был слишком робок с мускулатурой - но это было слишком поздно... Я уже разломал модель на кусочки... Чтобы исправить ситуацию, я слепил мускулы на новой плоскости, используя временную карту нормалей, запеченную от более ранней версии как шаблон, затем я вычислил карту нормалей между этой геометрией и полигоном и смешал ее поверх старой карты нормалей, чтобы укрепить мускулы. Финальное изображение Тени. А ниже модель с «супер-настроенной» картой нормалей. Это практически все, что я хотел сказать в этом уроке и если Вы все еще его читаете, вероятно было кое-что, что захватило Ваше внимание. Спасибо за чтение. 5. Финальная модель В заключении этого урока я хотел бы показать Вам несколько финальных визуализаций Varga (полностью оттекстурированных). Я надеюсь, что Вы наслаждались этим уроком и что Вы действительно нашли кое-что полезным, потратив время, просматривая его. Удачи с картами нормалей! Перевод Беляев Валерий ака seaman. |
Автор: RIDDICK | Спасибо огромное!!!
Очень класный материал и перевод |
Автор: SAT | Здесь тоже самое появилось, кто-то еще перевел. По нормал картам материал очень полезный. |
Автор: Magrit | Это кстати первый мейкинг который я увидел вообще =) Мне тогда казалось, что это космически нереальные высоты и что чем больше полигонов в модели - тем лучше =) |
Автор: charlyxxx | Ооо, круть! Огромное спасибо! |
Количество просмотров у этой темы: 11900.
← Предыдущая тема: 'Making of Odin's Final Battle' by Marthin Agusta Simny(eng)