Ogre3D Intermediate Tutorials / Промежуточные туториалы Ogre3D: Intermediate Tutorial 6: Projective Decals
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
ВВЕДЕНИЕ proVIDec 25.09.11 в 06:17 |
|
|
В этом уроке мы рассмотрим добавление проективных декалей на объекты сцены. Mingun 13.10.11 в 14:15 |
||
|
Проективное текстурирование очень полезно, когда вы хотите сделать что-нибудь, вроде индикатора выделения на земле, перекрестья прицела, нарисованного непосредственно на цели, либо ещё что-нибудь с помощью декалей, которые проецируются на какой-нибудь объект (однако, сами не становятся неотъемлимой частью текстуры этого объекта). Mingun 13.10.11 в 14:13 |
||
|
Вот снимок экрана с изображением текстуры, спроецированной на любимую каждому голову Огра: H0tHead 27.09.11 в 04:48 |
||
|
С ЧЕГО НАЧАТЬ Mingun 13.10.11 в 14:18 |
||
|
НОВЫЕ ТЕКСТУРЫ proVIDec 25.09.11 в 06:17 |
||
|
Перед тем как мы начнем наш проект, мы должны добавить две текстуры, которые будем потом использовать: H0tHead 27.09.11 в 04:48 |
||
|
Лучше всего положить эти файлы в папку <tt>media/materials/textures</tt> (для большинства людей эта папка располагается в папке SDK Ogre). Mingun 13.10.11 в 14:20 |
||
|
Также убедитесь, что все имена текстур находятся в нижнем регистре и их имена совпадают с именами текстур, используемых в этом уроке. Версия огра 1.7 не чувствительна к регистру букв в названии текстур. Данное условие проверять не обязательно. (прим. переводчика) H0tHead 27.09.11 в 04:51 Также убедитесь, что все имена файлов находятся в нижнем регистре и совпадают с именами, используемыми в этом уроке. Mingun 13.10.11 в 14:24 |
+1 | |
|
НАЧАЛЬНЫЙ КОД Mingun 13.10.11 в 14:20 |
||
|
Настройте свой проект Intermediate Tutorial 6 подобно тому, что показано ниже: H0tHead 27.09.11 в 04:52 |
||
|
Скомпилируйте и запустите программу перед тем как мы продолжим. H0tHead 27.09.11 в 04:53 |
||
|
Вы должны увидеть шесть голов огра. H0tHead 27.09.11 в 04:53 |
||
|
ПРОЕКЦИОННЫЕ ДЕКАЛИ H0tHead 27.09.11 в 04:53 |
||
|
КОНУС ОТСЕЧЕНИЯ H0tHead 27.09.11 в 04:53 |
||
|
Конус отсечения представляет собой усеченную пирамиду, верхней гранью которой является ближнее отсечение камеры, а основанием - дальнее отсечение камеры. Данная пирамида представляет собой видимое пространство камеры. H0tHead 27.09.11 в 04:55 |
||
|
Огр использует это для отображения с камер( класс Camera напрямую наследуется от класса Frustum) H0tHead 27.09.11 в 04:57 |
||
|
В этом уроке мы будем использовать конус отсечения для проецирования декалей на наши объекты(меши) в сцене. H0tHead 27.09.11 в 04:58 |
||
|
Первое что мы должны сделать для создания проектора - это сформировать усеченную пирамиду, которая будет представлять наш проектор и прикрепить ее к узлу сцены. H0tHead 27.09.11 в 04:59 |
||
|
Найдите метод createProjector() и добавьте следующий код: H0tHead 27.09.11 в 04:59 |
||
|
Это создаст проектор, который будет увеличивать нашу декаль по мере того, как мы все дальше будем удалятся от объекта, подобно тому, как работает проектор в кинотеатре. H0tHead 27.09.11 в 05:01 |
||
|
Если вы хотите создать проектор, который будет сохранять постоянный размер проекционной текстуры независимо от дистанции, вы должны добавить следующее в ваш код( в нашем уроке мы не будем этого делать): H0tHead 27.09.11 в 05:02 |
||
|
setOrthoWindowHeight() используется вместе с соотношением сторон и устанавливает размер ортографического конуса. H0tHead 27.09.11 в 05:03 |
||
|
Перед тем как продолжить, примите к сведению куда наш конус будет проецировать декаль. H0tHead 27.09.11 в 05:05 |
||
|
В этом приложении мы используем круг, образованный 6-ю головами огра, наш проектор располагается в центре этого круга( немного смещен вверх на 5 единиц) и ориентирован по направлению -Z (до тех пор пока мы его не изменим, это направление по умолчанию). H0tHead 27.09.11 в 05:08 |
||
|
Это в конечном счете значит, что когда мы запустим наше приложение. декали будут проецироватся на заднюю часть голов. H0tHead 27.09.11 в 05:09 |
||
|
ИЗМЕНЯЕМ МАТЕРИАЛ H0tHead 27.09.11 в 05:09 |
||
|
Для отображения наших декалей, материалы, которые используются в сцене, должны получать эти декали. H0tHead 27.09.11 в 05:11 |
||
|
Мы сделаем это путем добавление нового прохода, который будет рендерится поверх основной текстуры. H0tHead 27.09.11 в 05:11 |
||
|
Конус отсечения определяет положение. размеры и форму проецируемой декали. H0tHead 27.09.11 в 06:43 |
||
|
В этом примере мы изменим сам материал для получения декали, но для большинства реальных приложений вы должны сделать копию материала. Таким образом вы сможете менять ваши материалы с вновь созданных к базовым и обратно. H0tHead 27.09.11 в 06:46 |
||
|
Первое что мы сделаем - это добавим материалу еще один проход. H0tHead 27.09.11 в 06:46 |
||
|
Найдите метод makeMaterialReceiveDecal() и добавьте следующий код: H0tHead 27.09.11 в 06:48 |
||
|
После создания прохода мы должны настроить освещение и смешивание. H0tHead 27.09.11 в 06:49 |
||
|
Мы добавим новую текстуру, которая будет корректно смешиваться с текущей текстурой на объекте. H0tHead 27.09.11 в 06:49 |
||
|
Для этого установим тип смешивания по прозрачному альфа-каналу и выставим смещение глубины в 1 (таким образом, наша декаль останется непрозрачной) H0tHead 27.09.11 в 06:51 |
||
|
Напоследок. мы должны отключить освещение, поскольку хотим видеть нашу декаль вне зависимости от глобального освещения объекта. H0tHead 27.09.11 в 06:53 |
||
|
Если вы хотите, чтобы цвет декали в вашем приложении зависел от освещения, не добавляйте последний код в вашу функцию: H0tHead 27.09.11 в 06:54 |
||
|
После создания прохода, необходимо создать текстурную единицу используя нашу текстуру decal.png H0tHead 27.09.11 в 06:55 |
||
|
Второй метод указывает на то, что мы будем использовать проекционное текстурирование, а в качестве проектора будет использоваться созданный нами конус отсечения. H0tHead 27.09.11 в 06:56 |
||
|
Последние две функции устанавливают фильтрацию и тип адресации текстурных координат. H0tHead 27.09.11 в 06:56 |
||
|
Мы установили режим адресации Clamp( заделка ), таким образом наша текстура не будет повторятся на объекте. H0tHead 27.09.11 в 06:57 |
||
|
В опциях фильтрации текстур указываем следующие параметры: при приближении к объекту использовать стандартную линейную фильтрацию, при удалении - не использовать фильтрацию, использование мипмап отключено. H0tHead 27.09.11 в 09:15 |
||
|
Это предотвращает размытие прозрачной границы декали по текстуре. H0tHead 27.09.11 в 09:16 |
||
|
Если мы этого не сделаем, то получим отвратительные размытия по всей текстуре там, где не наложена наша декаль. H0tHead 27.09.11 в 09:18 |
||
|
Это все, что необходимо для установки материала. H0tHead 27.09.11 в 09:18 |
||
|
ВЫЗОВ ФУНКЦИЙ H0tHead 27.09.11 в 09:18 |
||
|
Мы создали необходимые методы, теперь мы должны вызвать их для создания проектора и создания материалов. H0tHead 27.09.11 в 09:19 |
||
|
Добавьте следующий код в конец метода createScene: H0tHead 27.09.11 в 09:19 |
||
|
Отметим, что переменная ent хранит в себе указатель на последнюю созданную в цикле голову огра. Поскольку все головы используют один и тот же материал. нам необходимо взять произвольную голову и получить имя используемого материала. H0tHead 27.09.11 в 09:22 |
