Очень многие стали задавать вопрос, как делать реальные статические тени в играх. Ответ прост - LightMap (Карта света).
Я решил написать урок по созданию Light Map(ЛМ), потому что на мой взгляд это легко и красиво. :)
Для этого нам понадобится 3D Studio MAX 5(или больше) и игровой движок.
***
Часть 1
-----------------------------
Вот наша сцена.
Делаем её супермегареалистичной :)))
Я использовал для этого Mental Ray рендер.
Наворотил её немного. Добавил текстур, источников света разноцветных и т.д...
Также добавил камеру.
Отрендерил то, что получилось.
А вот, как выглядит в Максе.
В этом уроке мы создадим 2 ЛМ. Одна для стен и пола(потолка), другая для объектов. Итак приступим.
***
Часть 2
-----------------------------
Атачим все объекты сцены в один. (Editable Poly->Attach) Применим к
этим объектам модификатор Unvrap UVW и присмотримся к его панели.
Там мы найдем пункт Map Channel(Канал текстуры). По умолчанию он
первый. Если нажать кнопку Edit, то мы увидим координаты нашей
наложеной текстуры. Она у нас наложена по первому каналу. Закроем окно
Edit. Пока оно нам не нужно.
Нажимаем 0(ноль). Или в меню вверху вибираем Rendering->Render to texture. Появляется вот эта панель.
Жмём кнопку Add и в списке выбираем Lightning Map. Теперь называем нашу текстуру и указываем путь.
(1) Устанавливаем нужный размер текстуры (обязательно кратный степени
двойки). Лучше выбрать из уже предоставленых. Он появится в поле Size.
(2) И ставим галочку Render to files only.
(3) Это делается для того, чтобы текстура не накладывалась сразу на объект.
Вернемся к панели Unwrap UVW. Сменим Map Channel на 2. Выскочит
табличка - жмём да. Потом жмём Edit. Теперь (ВАЖНО!!!) проследите,
чтобы ни один вертекс не был выделен. Для этого нужно отъехать подальше
и кликнуть на свободном месте. В верхнем меню выбираем Mapping,
Flattern Mapping (если нету маленьких полигонов, можно параметр Spacing
уменьшить до 0,01) и жмём ОК.
Потом в окне Render to texture. Выбираем Map Channel 2. Объект должен быть всегда выделен(!!!).
Всё готово, можно рендерить в текстуру! :)
И вот, что у нас вышло.
Теперь повторяем то же, но для стен и пола. Вот, как выглядит этот ЛМ.
***
Часть 3
-------------------------------
Теперь нужно как-то отобразить ЛМ в игре.
Для этого нам понадобится какойнибудь экспортер в ваш движок. Я использовал экспортер для Blitz3D. У вас - свой.
Примечание: если у вас нет экспортера, то переходим к Послесловию.
Итак. Сохраняем сцену под другим именем. Выделяем объект. Выбираем из списка материалов движковый материал.
И на первый слой наносим текстуру, которая должна быть на объекте.
Тип нанесения - Multiply.
Я включил mipmap,color... это особенности движка. Но самое главное - Map Channel. Он должден быть установлен в "1".
Теперь на второй слой наносим наш сохраненный ЛМ. Но! Map Channel уже нужно выставить "2".
Нужно убедится, что у объекта есть второй Map Channel. Для этого
применим к нему Unwrap UVW(если он уже не применен) и переключившись на
Map Channel 2, нажмем кнопку Edit. Если текстурные координаты выглядят
так же, как мы их создавали, то всё в порядке. Если появляются сомнения
насчет этого, то снова идем в меню Mapping->Flattern Mapping и жмем
ОК, как и в прошлый раз(!) Нужно повторить всё, что мы делали в прошлый
раз!
Если всё в порядке, то повторяем всё теперь с остальными материалами и смотрим, что вышло. :)
Вот, что вышло у меня.
Это движковый рендер.
А вот как выглядит в максе сцена, если показывать второй канал на всех материалах.
***
Послесловие.
Если у вас нет экспортера, то наложение текстур придется делать вручную
в движке. Или писать свой экспортер, который поддерживает несколько
слоев.
Если есть какие-нибудь вопросы, присылайте мне на мыло.
Всем желаю удачи!
Buck.