Урок 2.
Часть 2. Выращиваем траву и деревья, добавляем воду и эффекты, повышающие реализм сцены.

Ты умеешь выращивать цветочки?...
Ты умеешь получать от меня деньги,
а я эти деньги умею зарабатывать!!!...
(Из диалога Туранчокса и Торки,  к/ф
«Через тернии к звездам».)

    Ну не знаю как насчет того, чтобы научиться зарабатывать деньги, - этому вряд ли возможно научить, так как это дается с рождения. А вот разводить цветочки, и не только, в нашем виртуальном мире возможно и даже полезно!
    В этой части урока 2 мы продолжим работу над нашим виртуальным миром, который мы с Вами, уважаемый посетитель сайта, начали создавать в первой части данного урока. Сейчас мы займемся дальнейшим усовершенствованием нашего маленького мирка, добавив в него растения, воду и эффекты, без которых его реализм сильно пострадал бы.
    Наверно все замечали в фильмах, особенно где съемки велись либо на открытой местности, либо в горах в солнечную погоду, что возле Солнца появляются характерные для камер да и для всей оптики в целом блики. Эти блики вызываются отражением солнечного света от линз съемочной камеры и называется
«эффектом линз» соответственно. Мы к этому настолько привыкли, что если их нет, то сразу появляется сомнение в реальности видимого нами, не так ли?
    Поэтому давайте добавим в нашу сцену такой эффект линз, добавив еще один плюс её реализму.
Теория возникновения такого эффекта достаточно сложна для математического и программного его моделирования. Тот, кто заинтересуется этим более глубоко, то могу порекомендовать обратиться к учебникам физики для ВУЗов, либо поискать в Инете. Мы же не будем снова и снова изобретать велосипед, а воспользуемся наработкой создателей Quest3D по реализации данного эффекта. Тем более, что эффект линз в программе реализован очень даже прилично и реалистично на мой взгляд. Единственный минус
отсутствие соответствующего Template, хотя данный эффект нужно часто использовать при имитации открытых пространств.
    Единственный выход состоит в самостоятельном создании темплейта
Lens Flare использовав другой, в котором этот эффект реализован. Запустите на выполнение установленную у Вас на компьютере версию Quest3D. В созданный по умолчанию пустой проект добавьте в Channel Graph канал Templates-Nature Painting-Scenes-Beautifullweather (см. рис. L2.26.). Удалите все каналы, кроме показанных на рис. L2.27.   
Рис. L2.26.
Рис. L2.28.              
Рис. L2.33.                                                                                                              Рис. L2.34.
Рис. L2.29.                                            
    Выделите щелчком мыши папку Do Lensflare и нажмите клавишу Space, чтобы извлечь содержимое данной папки. У Вас должен получиться вид Channel Graph, похожий на показанный на рис. L2.28. Сохраните то, что у нас получилось в таком виде на диск, выбрав в меню File-Save All. Создайте пустую папку Lens Flare и сохраните в ней группу каналов под именем LensFlare.cgr (см. рис. L2.29). Теперь нужно поместить наше творение в Templates программы, чтобы его можно было многократно использовать. Закройте программу, затем скопируйте содержимое папки Lens Flare (два файла LensFlare.cgr и LensFlare.igr) в папку …Program Files\Act-3D\Quest3D 2.0b\Template\3D Items\Camera. Теперь запустив Quest3D и развернув список Templates-3D Items-Camera можно увидеть появившийся, созданный нами темплейт LensFlare ( см. рис. L2.30).   
<<  Перейти к оглавлению                                            
Рис. L2.27.
Рис. L2.30.                                            
    Давайте теперь поместим темплейт LensFlare в нашу сцену, перетащив его в Channel Graph и прилинковав к каналу Start 3D Scene (см. рис. L2.31). Как видим, чего хотели, того и добились и теперь данный эффект можно наблюдать при взгляде на наш мир глазами «виртуального» Я (см. рис. L2.32).   
Рис. L2.31.                                                                                                         Рис. L2.32.       
    Теперь займемся созданием водной поверхности озера в нашем мире. Водные поверхности можно создавать различными путями, у каждого из методов свои достоинства и недостатки. Я предлагаю Вам использовать для создания воды встроенную в Quest3D возможность использования шейдеров DirectX. Это проще, да и результат выглядит намного более реалистичнее, чем при использовании методов создания воды без использования шейдеров.
Начнем с создания поверхности воды, к материалу которой затем будет применен шейдер. Кроме этого нужно создать кубическую текстуру нашего мира, которая будет использована как параметр для передачи шейдеру в целях имитации отражений. В качестве поверхности воды используем стандартный примитив-плоскость, входящий в состав Quest3D и представленный каналом
Square. Плоскость должна быть размером, как и у ландшафта и размещаться в центре координатной системы мира, координата y плоскости подбирается так, чтобы при ее пересечении с ландшафтом, покрывался участок, показанный на рис. L2.33 и обведенный красной линией. Перетаскиваем в Channel Graph канал Templates-3D Items-Primitives-Square (см. рис. L2.34.) и прилинковываем его к DX8 3D Render. Для избежания путаницы переименуем Square в WaterSurface. В секции Animation выделим строку WaterSurface и изменим параметры плоскости:
Move: X= 0, Y= -7, Z= 0;
Rotate: X= 0, Y= -90, Z= 45;
Scale: X=700, Y= 700, Z=1.
    
    У Вас должно получиться пересечение плоскости воды и ландшафта, похожее показанному на рис. L2.35. Теперь нам необходимо сделать небольшую реконструкцию вида Channel Graph нашего ландшафта, чтобы подготовить его к использованию шейдера. Для этого разрываем связь нашего DX8 3D Render с каналом Start3D Scene (выделить, пока связь не станет красной, затем Delete ). Добаваим в Channel Graph канал Templates-Logic-Channel Caller и прилинкуем к нему наш DX8 3D Render, а сам Channel Caller - к Start3D Scene (см. рис.L2.36.).  
    Заходим в папку группы каналов WaterSurface (если они у Вас находятся в папке) и поместим сюда группу каналов шейдера Templates-3D Items-Shaders-Reflective Water Surface (см. рис. L2.37.). Удаляем папку каналов Vertex Data прилинкованную к Water Surface и вместо нее линкуем Reflective Water Shader (см. рис. L2.38.). В принципе это и все, шейдер уже будет работать и если Ваша видеокарта поддерживает шейдеры, то можно заметить, что теперь наша плоскость стала напоминать поверхность воды, но все-равно все не так просто, как на первый взгляд может показаться. Волны есть не везде, да и отражение в воде не соответствует нашему пейзажу… 
Рис. L2.35.       
    Дело в том, что, во первых, необходимо подготовить текстуры для определения области волн Wave Area и создать кубическую карту отражений нашего пейзажа в воде Reflection, во вторых нужно настроить некоторые параметры шейдера, определяющие внешний вид водной поверхности. Coздадим в Photoshop пустой файл размером 256х256 рх и заполним его площадь серым цветом (примерно 50% черного). Сохраним его на диск в папку файлов проекта под именем W_area.jpg. Теперь не закрывая этот файл заполним площадь чистым черным цветом и сохраним его там же под именем W_area_alpha.jpg. Эти файлы текстур будут определять форму волновой поверхности квадратной формы, что нам и нужно. Теперь применим полученное нами к параметру шейдера. Сделайте двойной клик на значке текстуры шейдера Wave Area. В появившемся окне Texture нажмите кнопку Load и загрузите текстуру W_area.jpg с диска (см. рис. L2.39.).   
Рис. L2.38.                                                                                                            Рис. L2.39.
    В этом же окне потом загрузите с диска файл текстуры W_area_alpha.jpg, нажав на кнопку Load Alpha.. Проверить, что текстура загрузилась нормально, можно активировав радиокнопку Show: Alpha (см. рис. L2.40.).
    Теперь займемся созданием кубической текстуры
Reflection, благодаря которой в шейдерной водичке будут отражаться некоторые части нашего виртуального окружения, что несомненно улучшит внешний вид водяной поверхности, генерируемой шейдером. В шейдер Reflective Water Surface уже встроена по умолчанию такая текстура, но увы.. она нам не подходит, так как это текстура другого мира, а не нашего. Нам придется создать аналогичную для нашего мира, чем мы сейчас и займемся. Для этой цели в Templates есть специальная группа каналов DX8 Render ToCubeMap, которая предназначена для динамического создания в процессе работы основного рендера кубической карты текстуры окружения. Единственный нюанс - использовать эту группу нужно до прорисовки нашего мира на экране монитора, так как шейдер должен иметь всю необходимую ему информацию до начала рендеринга воды. Для этого мы и сделали небольшую реконструкцию в Channel Graph, описанную выше, добавив канал Channel Caller и изменив порядок линковки. Ищем канал DX8 Render ToCubeMap (см. рис.L2.41.), перетаскиваем его в Channel Graph и линкуем его к Channel Caller, как показано на рис. L2.42.
Внимание! Канал DX8 Render ToCubeMap должен быть обязательно прилинкован к первой позиции линковки канала Channel Caller!    
Рис. L2.40.                                                                                                             Рис. L2.41.
    Теперь кратко о канале DX8 Render ToCubeMap.
К первой позиции линковки указанного канала прилинкован
Value Vector - этот канал представляет собой вектор положения виртуальной камеры, через которую производятся снимки окружающего камеру мира в 6 направлениях. По умолчанию - это вектор положения центра мира (координатной системы). Для избежания появления визуальных артефактов необходимо виртуальную камеру немножко поднять над ландшафтом, т.е. изменить ее Y координату в значение 5-7! Все последующие child links используются для присоединения объектов, которые должны быть прорисованы в генерируемой таким образом кубической текстуре.
   Давайте теперь создадим
Shortcut's для каналов Land, Sky и Clouds и прилинкуем их в предназначенные для них линковочные позиции, как показано на рис. L2.42. Изменим значение среднего канала Envelopes, прилинкованного к каналу Value Vector на 5…7 (см. рис. L2.43.).  
Рис. L2.42.
Рис. L2.43.
    Если теперь запустить на выполнение нашу сцену, то можно заметить, что в левом верхнем углу окна обзора появился мигающий черный квадрат. Это связано с тем, что канал DX8 Render ToCubeMap при своей работе использует для хранения промежуточных данных буфер экрана. Поэтому, чтобы предотвратить его появление, необходимо в каждом кадре перед рендерингом основной сцены делать очистку экранного буфера. Для этого перетащим из Templates-Functions в Channel Graph канал DX8 Clear screen и прилинкуем его к Channel Caller в последовательности слева направо DX8 Render ToCubeMap, DX8 Clear screen и DX8 3D Render, как показано на рис.L2.43. Если по каким-либо причинам последовательность не такая, то разорвите временно нужный линк и перелинкуйте каналы по-новому, согласно изображенному на рисунке. Теперь создайте Shortcut канала DX8 Render ToCubeMap и перетащите его на значок папки Water Surface и отпустите кнопку мыши. Войдите в папку Water Surface, удалите канал Reflection, а вместо него прилинкуйте наш Shortcut DX8 Render ToCubeMap (см. рис. L2.44.).   
Рис. L2.45.
Рис. L2.46.
Рис. L2.44.
    Теперь шейдер готов к работе по отрисовке виртуальной воды, осталось только настроить его параметры, чтобы вода не выглядела «мертвой». Давайте займемся этим.
    Измените значения каналов, прилинкованных к
Shader Info на следующие значения:
Speed=0.51;
Wave speed=0.77;
Falloff=0.46;
Bounce=0.9;
Splash=0.2.

Вид водяной поверхности, который получился у меня после подбора параметров шейдера, Вы можете видеть на рис.L2.45 и L2.46.Попробуйте самостоятельно изменять эти параметры, чтобы почувствовать, какой из них на что влияет во внешнем виде водной поверхности. Может быть у Вас вид воды получится лучше, чем у меня!
    Теперь самое время заняться
«выращиванием цветочков», так что берите лопаты, ведра и вперед «на баррикады»… шутка. 
Рис. L2.50.
    Так как мы перед этим работали над созданием воды, то давайте продолжим работу над оформлением нашего виртуального водоема и насадим вдоль его берегов камыши. Стоит заметить, что встроенная в Templates модель камыша выглядит довольно реалистично, хотя и спрайтовая, в отличии от других, которые в дальнейшей части урока мы заменим своими собственноручно изготовленными.
Итак, поместим в
Channel Graph группу каналов Templates-Nature Painting-Plants-WaterSidePlant (см.рис. L2.47.). Прилинкуйте WaterSidePlant к каналу DX8 3D Render, затем создайте Shortcut для группы каналов Land (наш ландшафт) и прилинкуйте его к каналу Collision Objects группы WaterSidePlant, которую мы только что поместили (см.рис. L2.48.). 
Рис. L2.47.
Рис. L2.48.
    Теперь переходим в режим Nature/Pathfinding (при помощи выбора в выпадающем списке выбора режимов в правом верхнем углу окна программы, помните?). В левой части окна программы во вкладке Nature Painting выделите строку WaterSidePlant, затем активируйте радиокнопки Random и Sphere ( случайное изменение размеров объектов и форма области, в которой производится «выращивание» растений соответственно). Выставьте в полях для ввода величин следующие значения:
Size X=Size Y=Size Z=4;
randX=randY=randZ=2;
  
Fade distance=30
(начало затухания видимости объекта);
Cull distance=50…2000 (расстояние в юнитах, при котором объект не прорисовывается рендерером. Если у Вас слабый компьютер, выставлять максимальные значения не рекомендуется в целях сохранения скорости отрисовки и в конечном итоге быстроты работы над сценой!).
    Нажмите кнопку
Paint Mode и поместите курсор мыши в окно 3D обзора, не забудьте перейти на вид из встроенной по умолчанию камеры, иначе будет невозможно видеть весь ландшафт целиком с высоты, что в данном случае необходимо.
Рис. L2.36.       
Рис. L2.37.       
    Кликая мышью на точках вдоль побережья нашего виртуального водоема, выращивайте камыши быстро и непринужденно. Размер области посадки меняется при помощи регулятора Size, плотность посадки регулятором Density (см. рис. L2.49 и L2.50.). Если необходимо будет удалить посаженные не там, где надо камыши, просто перейдите в режим стирания кнопкой Erase Mode и помещая удаляемые растения в область, помеченную желтым цветом, кликом удалите ненужное. Поработав таким образом, Вы быстро освоитесь, и за довольно короткий срок сделаете наш водоем красиво выглядящим. То, что получилось у меня, показано на рис. L2.51-L2.54.   
Рис. L2.49.
Рис. L2.51.
Рис. L2.52.
Рис. L2.54.
Рис. L2.53.
    Как видите, старания не пропадают даром, и даже виртуальное солнце довольно реалистично проглядывает сквозь наши камыши!
В следующей 3-й части урока 2 мы продолжим работать над заполнением нашего мира растениями и введем некоторые необходимые ограничения для перемещения нашего персонажа (пока только камеры). Растения будем моделить самостоятельно в пакете 3д моделлинга, затем будем экспортировать их в квест, а импортировав в квесте создадим на их основе свои темплейты растений, которые можно будет многократно использовать в будущих проектах.

    Желаю успехов! До скорой встречи на страницах сайта!   
Используются технологии uCoz