Главная » Статьи » Деццкий сад

Делаем игру вместе. Урок №2.
В этом уроке мы будем текстурировать и освещать наш ландшафт.

Открываем location.py и в разделе импорта дописываем импорт необходимых нам модулей:

Code

from pandac.PandaModules import Texture,TextureStage
from pandac.PandaModules import AmbientLight, PointLight

Теперь переходим к нашему классу gameLocation и дописываем в него две процедуры - setTexture и setLights

Code

     def setTexture(self,texFile,sx,sy):
         self.terrain.getRoot().setTexture(loader.loadTexture(texFile))
         self.terrain.getRoot().setTexScale(TextureStage.getDefault(), sx, sy)
         self.terrain.getRoot().getTexture().setMinfilter(Texture.FTLinearMipmapLinear)
          
     def setLights(self,ambient_l,camera_l):
         self.ambientLight = render.attachNewNode( AmbientLight( "ambientLight" ))
         self.pointLight = camera.attachNewNode( PointLight( "PointLight" ) )
         self.ambientLight.node().setColor(ambient_l)
         self.pointLight.node().setColor(camera_l)
         render.setLight( self.ambientLight )
         render.setLight( self.pointLight )

В setTexture мы будем передавать имя файла текстуры и её масштабирование, точнее то, сколько раз она должна уложиться на нашем террайне по горизонтали и по вертикали. Смотрим в саму процедуру:
Первая строка - её можно было бы разложить на несколько, точнее наоборот - это собранные в одну строку несколько операторов. Разберём запись подробнее - в дальнейшем я часто буду использовать свёрнутую запись чтоб не растягивать код на много строк. В развёрнутом виде она выглядела бы так:

Code
np=self.terrain.getRoot()
tex=loader.loadTexture(texFile)
np.setTexture(tex)

Здесь мы получаем корневой узел террайна в переменную np, загружаем текстуру в переменную tex и присваиваем загруженную текстуру корневому узлу. Как видите, в свёрнутой записи мы сокращаем код и избавляемся от лишних переменных.
Вторая строка - устанавливаем масштаб текстуры. Функция TextureStage.getDefault() получает дефолтные свойства текстуры. Остальное думаю ясно и так.
Третьей строкой мы устанавливаем фильтрацию. В нашем случае трилинейную. Попробуйте закомментировать строку и посмотрите как будет выглядеть )

Теперь setLights. В setLights мы будем передавать два параметра - цвет общего освещения и цвет точечного источника, прикреплённого к камере.
Первая строка - создаём и отправляем в корневой узел источник общего освещения сцены. Общее освещение даёт равномерный рассеянный свет и не создаёт затенения.
Вторая строка - создаём точечный источник и закрепляем его на камере. Точечный источник подобен лампочке и соответственно, освешает поверхности, обрашённые к нему. Замечу, что источники света не создают теней в привычном нам понимании - для этого служат другие методы - они лишь лишь дают определённую освещённость поверхности.
Третья и четвёртая строка устнавливают цвет и силу источников.
Пятой и шестой строкой мы применяем созданные нами источники так что теперь они будут освещать заданный узел (в нашем случае - корневой - render) и всех его чайлдов.

Сохраняем location.py и открываем main.py
Дописываем в импорт модуль Vec4

Code
from pandac.PandaModules import Vec4

Класс Vec4 позволяет задавать четырёхкомпонентный вектор, который нам потребуется для указания цвета источников света.
После строки, где мы генерируем наш террайн дописываем строки с написанными нами только что процедурами
Code
loc.setTexture('res/textures/grass.png',20,20)
loc.setLights(Vec4(0.6,0.6,0.6,1), Vec4(1,1,1,1))

Соответственно - загружаем текстуру (текстуру предварительно закидваем в папку :)) и устанавливаем источники освещения.
Цвет и сила освещения, как я уже сказал, устанавливается четырёхкомпонентным ветором. Первые три компоненты - составляющие RGB (red green blue) цвета. Задают (от 0 до 1) силу и присутствие соответствующего цвета. Четвёртая компонента - влияние при смешивании нескольких источников света.

Сохраняем, запускаем. Опять же можем повращать и подвигать камеру с помошью зажатых клавиш мыши - левая - перемещение в плоскости взгляда; правая - приближение, отдаление; средняя - вращение. Забыл сказать, что это дефолтное управление и импортируется оно вместе с DirectStart, следующим уроком мы его будем отключать и писать своё.

Категория: Деццкий сад | Добавил: ninth (13.05.2009)
Просмотров: 7016 | Рейтинг: 5.0/4
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0