Ogre3D Basic Tutorials / Базовые туториалы Ogre3D: Basic Tutorial 3: Terrain, Sky, and Fog
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Так как мы создаем только один ландшафт, мы вызываем функцию defineTerrain один раз. alexx_x 11.07.11 в 13:47 |
|
|
Если бы мы захотели создать несколько разнообразных поверхностей, мы могли бы сделать это здесь. alexx_x 11.07.11 в 13:48 Но если бы мы захотели создать несколько кусков ландшафта, мы сделали бы это здесь. Mingun 24.07.11 в 07:59 |
||
|
Более подробно с функцией defineTerrain мы познакомимся позднее. alexx_x 11.07.11 в 13:49 |
||
|
Теперь, если мы только что импортировали наши ландшафты, мы хотим рассчитать карты смешивания (blendmaps): alexx_x 11.07.11 в 13:50 Если мы впервые импортировали куски ландшафта, нам необходимо рассчитать карты смешивания: Mingun 24.07.11 в 08:02 |
||
|
Этот цикл перебирает все доступные нам ландшафты и у каждого вызывает функцию initBlendMaps. alexx_x 11.07.11 в 13:51 Этот цикл перебирает все доступные нам куски ландшафта и на каждом вызывает функцию initBlendMaps. Mingun 24.07.11 в 08:03 |
||
|
Описание этой функции будет позднее. alexx_x 11.07.11 в 13:52 |
||
|
Теперь все, что осталось сделать - это подчистить исходное создание ландшафта: wuffur 11.07.11 в 17:19 Теперь все, что осталось сделать – это подчистить за собой мусор, оставшийся после начального создания ландшафта: Mingun 24.07.11 в 08:05 |
||
|
ВСЕ ЕЩЕ ФУНКЦИЯ createScene wuffur 13.07.11 в 06:38 ВИД ФУНКЦИИ createScene В ДАННЫЙ МОМЕНТ Mingun 24.07.11 в 08:06 |
||
|
Так выглядела функция createScene класса BasicTutorial3 до сих пор: wuffur 11.07.11 в 17:22 В данный момент функция createScene() нашего класса BasicTutorial3 выглядит так: Mingun 17.10.11 в 15:47 |
||
|
Не пробуйте компилировать сейчас - программа не будет работать до тех пор пока мы не включим служебные(вспомогательные) функции! wuffur 11.07.11 в 17:23 Не пробуйте скомпилировать программу сейчас, она не заработает до тех пор, пока мы не реализуем еще несколько служебных функций. alexx_x 13.07.11 в 07:51 Не пытайтесь скомпилировать программу сейчас - она не будет работать, поскольку мы ещё не реализовали несколько служебных функций. Mingun 24.07.11 в 08:08 |
+1 | |
|
configureTerrainDefaults wuffur 11.07.11 в 17:23 Функция configureTerrainDefaults Mingun 24.07.11 в 08:08 |
||
|
Компонент Ogre Terrain довольно хорошо настраивается. wuffur 11.07.11 в 17:56 |
||
|
Найдите функцию configureTerrainDefaults и добавьте следующий код: wuffur 11.07.11 в 17:56 |
||
|
Во-первых, мы определили две глобальные опции: MaxPixelError и CompositeMapDistance. wuffur 11.07.11 в 17:57 |
||
|
MaxPixelError определяет насколько точным наш ландшафт будет. wuffur 11.07.11 в 17:58 MaxPixelError определяет, насколько точным будет наш ландшафт. Mingun 24.07.11 в 08:13 |
||
|
Нижнее значение будет означать более детальный ландшафт, за дополнительные машинные ресурсы (из-за большего количества вершин). wuffur 11.07.11 в 18:00 Меньшее значение этого параметра будет означать более аккуратный ландшафт за счет большей нагрузки на компьютер (из-за увеличения количества полигонов) alexx_x 13.07.11 в 08:02 Меньшее значение этого параметра будет означать более качественный ландшафт, но требовать больше вычислительных ресурсов (из-за увеличения количества вершин). Mingun 17.10.11 в 15:54 |
||
|
CompositeMapDistance определяет насколько далеко ландшафт в Ogre будет рендерится отображение света. wuffur 11.07.11 в 18:01 CompositeMapDistance определяет на каком расстоянии от нас будет рендерится освещенный ландшафт (на большем расстоянием ландшафт будет рендерится без учета освещения). alexx_x 13.07.11 в 08:05 CompositeMapDistance определяет, на сколько далеко ландшафт будет отрисовываться с наложенной картой освещения. Mingun 24.07.11 в 08:15 |
||
|
В следующий раз будет разбираться с отображением света, используя наш направленный свет: wuffur 11.07.11 в 18:03 Далее, давайте разберемся с картой освещения, используя наш источник направленного освещения: Mingun 24.07.11 в 08:16 |
||
|
Она использует наш свет, чтобы определить направление и рассеивает свет и устанавливает цвет рассеивания так, чтобы он соответствовал окружающему цвета нашего менеджера сцены. wuffur 12.07.11 в 08:34 Здесь мы используем наш источник света для установки направления и цвета рассеянного освещения, в то время как цвет окружающего освещения берется из параметров менеджера сцены. Mingun 24.07.11 в 08:22 |
+1 | |
|
Теперь мы определим некоторые значения ImportData: wuffur 12.07.11 в 08:35 Далее мы определяем некоторые значения ImportData: Mingun 24.07.11 в 08:24 |
||
|
Мы не будем описывать, что и как с этими значениями в этом разделе руководства, но параметры terrainSize и worldSize установлены так, чтобы соответствовать нашим глобальным размерам (что мы говорили о нашей TerrainGroup) и inputScale определяет как картинка heightmap увеличина в размере. wuffur 12.07.11 в 08:38 В этом уроке мы не будем останавливаться на том, что это за значения и какими они могут быть, но отметим, что параметры terrainSize и worldSize установлены таким образом, что они совпадают с нашими глобальными размерами (которые мы задали в конструкторе TerrainGroup), а параметр inputScale определяет степень увеличения (масштаба) изображения карты высот. Mingun 24.07.11 в 08:31 |
||
|
Мы используем масштаб, из-за того, что картинки имеют ограниченную точность(замечание: вы можете использовать значение высоты в необработанных данных с плавающей точкой, чтобы избежать использование inputScale, но эти карты обычно требуют некоторую компрессию данных с потерями. В этом случае вы можете поставить значение inputScale = 1 ) wuffur 12.07.11 в 08:42 Здесь мы используем масштабирование, поскольку изображения имеют ограниченную точность представления (замечание: вы можете использовать карты высот с необработанными значениями с плавающей точкой для того, чтобы избежать использования параметра inputScale, но эти карты обычно используют сжатие с потерями. В этом случае вы можете установить параметр inputScale равным 1). Mingun 24.07.11 в 08:41 |
+2 | |
|
Необработанному значению heightmap, например, обычно не нужно масштабирование, из-за того, что величины накапливаются, как массив немасштабированных значений с плавающей точкой. wuffur 12.07.11 в 08:51 Карту высот, например, с необработанными значениями, обычно не нужно масштабировать, поскольку ее значения сохранены в виде массива неотмасштабированных чисел с плавающей точкой. Mingun 24.07.11 в 08:37 |
||
|
И последняя порция наших текстур: wuffur 12.07.11 в 08:51 Последнее – текстуры: Mingun 24.07.11 в 08:45 |
+2 | |
|
Здесь мы устанавливаем числа текстур ландшафта равными 3, с помощью вызова defaultimp.layerList.resize(3). wuffur 12.07.11 в 08:52 Здесь мы устанавливаем количество текстурных слоев ландшафта равным 3 с помощью вызова defaultimp.layerList.resize(3). Mingun 24.07.11 в 08:43 |
||
|
Потом мы инициализируем каждый слой, устанавливая параметр 'worldSize' и определяя имена текстур. wuffur 12.07.11 в 08:53 |
||
|
Параметр 'worldSize' определяет насколько большой будет каждая текстура при мультитекстурировании ландшафта(сплаттинге). wuffur 12.07.11 в 08:56 |
+2 | |
|
Более низкое значение будет увеличивать разрешение структур подвергающихся рендерингу. wuffur 12.07.11 в 09:01 Меньшие значения будут увеличивать разрешение отрисованных текстурных слоев. Mingun 24.07.11 в 08:54 |
||
|
Генератор материала по-умолчанию берет по две текстуры на каждый слой: wuffur 12.07.11 в 09:01 |
||
|
1. diffuse_specular - рассеянные текстуры с зеркальной картой на альфа канале. wuffur 12.07.11 в 09:30 1. diffuse_specular – текстура рассеянного освещения с картой бликов в альфа-канале. Mingun 24.07.11 в 08:56 |
||
|
2. normal_height - нормальные карты с картой высоты на альфа канале. wuffur 12.07.11 в 09:30 2. normal_height – карта нормалей с картой высот в альфа-канале. Mingun 24.07.11 в 08:57 |
||
|
Вся наша функция configureTerrainDefaults выглядит так: wuffur 12.07.11 в 09:30 |
||
|
А это наша функция defineTerrain: wuffur 12.07.11 в 09:31 |
||
|
Эта функция простая, но умная: wuffur 12.07.11 в 09:31 Это функция простая, но предельно ясная: Mingun 17.10.11 в 16:26 |
+2 | |
|
Во-первых, она спрашивает TerrainGroup, какое имя файла она будет использовать для генерации ландшафта wuffur 12.07.11 в 09:40 Сначала она узнает у объекта TerrainGroup, какое имя файла тот использует при генерации ландшафта. Mingun 24.07.11 в 09:00 |
||
|
Во-вторых, она проверяет, есть ли файл с таким именем в нашей группе ресурсов. wuffur 12.07.11 в 09:41 Затем она проверяет, есть ли файл с таким именем в нашей группе ресурсов. Mingun 17.10.11 в 16:27 |
||
|
И если он там есть, значит, что она уже сделала двоичный файл данных, и таким образом нет нужды импортировать его из нашей картинки. wuffur 12.07.11 в 09:43 И если он там есть, значит мы уже сгенерировали двоичный файл данных с ландшафтом и таким образом нет необходимости импортировать его из изображения. Mingun 24.07.11 в 09:03 |
||
|
Если там не представлен файл данных, то значит она генерирует ландшафт, и мы поэтому загружаем картинку и используем ее для определение ее. wuffur 12.07.11 в 09:44 Если же его там нет, это означает, что мы должны сгенерировать ландшафт, а для этого загрузить изображение и использовать его для определения ландшафта. Mingun 24.07.11 в 09:05 |
||
|
Функция использует маленькую вспомогательную функцию, называемую getTerrainImage(). wuffur 12.07.11 в 09:44 |
+1 | |
|
Поскольку эта функция действительно мала и используется только один раз, она определена в файле реализации как статическая локальная функция: wuffur 12.07.11 в 09:46 |
+2 | |
|
Она загружает картинку 'terrain.png' и места, где расположены ресурсы, отражая ее, если в этом есть необходимость. wuffur 12.07.11 в 09:48 Она загружает 'terrain.png' из архивов с ресурсами, зеркально отражая ее при необходимости. Mingun 17.10.11 в 16:33 Она загружает 'terrain.png' из архивов с ресурсами, зеркально отражая ее при необходимости. Mingun 17.10.11 в 16:33 |
+2 | |
|
Замечание: Отражение производится для имитации бесшовного ландшафта и вы можете делать неограниченно большой ландшафт используя одну heightmap текстуру размера 513x513, это просто трюк. wuffur 12.07.11 в 09:53 Замечание: отражение необходимо для имитации бесшовного ландшафта, так что вы можете сделать неограниченный по размерам ландшафт, используя всего одну карту высот размером 513x513, это просто трюк. Mingun 24.07.11 в 09:13 |
||
|
Если карты высот(heightmap текстуры) вашего ландшафта уже бесшовные и вам не нужно их отражать, то вы можете просто определить свои собственные карты высот для каждого куска ландшафта wuffur 12.07.11 в 10:02 Если карты высот вашего ландшафта уже бесшовные, вы не должны их отражать, просто определите собственные карты высот для каждого куска ландшафта. Mingun 24.07.11 в 09:16 |
||
|
В этом разделе руководства мы использует только объект TerrainGroup размера 1x1 (посмотрите на функцию createScene()) поэтому этот код в действительности не используется. wuffur 12.07.11 в 10:07 В этом уроке мы используем объект TerrainGroup размером 1x1 (посмотрите на функцию createScene()), так что на самом деле этот код не используется. Mingun 24.07.11 в 09:18 |
||
|
Вы помните три типа слоев ландшафта, определенных в configureTerrainDefaults()? wuffur 12.07.11 в 10:08 |
||
|
Теперь мы собираем смещивать их принимая в расчет высоту тайла. wuffur 12.07.11 в 10:09 Теперь мы будем смешивать их на основе ВЫСОТЫ тайла. Mingun 24.07.11 в 09:21 |
||
|
В настоящем проекте, вы можете использовать альфа сплаттинг расположенный в RGBA каналах в файле или файлах, которые отделены от heightmap текстур. wuffur 12.07.11 в 10:13 В настоящем проекте вы можете использовать альфакарту сплаттинга, хранящуюся в каналах RGBA в файле или файлах, которые отделены от карты высот. Mingun 24.07.11 в 09:23 |
||
|
Это функция initBlendMaps во всей своей полноте: wuffur 12.07.11 в 12:53 |
||
|
Мы не будет так углубляться, чтобы рассматривать каждую крупицу ее работы в этом руководстве. wuffur 12.07.11 в 12:54 В этом уроке мы не будем углубляться в подробности того, как она работает. Mingun 24.07.11 в 09:26 |
||
|
Давайте просто скажем, что она использует высоту ландшафта для сплаттинга трех его уровней. wuffur 12.07.11 в 12:55 Достаточно знать то, что она использует высоту ландшафта для сплаттинга трех его слоев. Mingun 24.07.11 в 09:29 |
