вторник, 6 января 2009 г.

Пример 1.2: Вращение камеры

В данном примере будет рассмотрена функция вращения камеры, а также некоторые функции библиотек "math" и "task". Итак, приступим.

Надеюсь, у вас сохранился код от примера 1 :), он нам здесь понадобится. Но все по порядку.

Для начала импортируем из движка библиотеки, которые нам позволят осуществить вращение. При это код импорта библиотек и использования подпрограмм теперь будет иметь вид :

#importing part
import direct.directbase.DirectStart
from direct.task import Task
import math


Первая строка - просто закомментированное пояснение чтобы поддать наш код некой структуризации. Вторая строка - с ней мы уже ознакомились в примере 1. Далее нам необходимо вызвать подпрограммы из базы "directbase". Для этого используется синтаксис: from ... import. 

Используя данный алгоритм, импортируем класс "Task" (в данном примере отвечает за задачу поворота камеры). 

Четвертая строка отвечает за импортирования математических функций.

С импортом разобрались, теперь перейдем непосредственно к обозначению переменной, которая бы отвечала за выполнение "task", то бишь задания, которое отвечало за поворот камеры. После строки envirom.setPos(-8,42,0) добавляем следующий код:

#Task to move the camera
def SpinCameraTask(task):
  angledegrees = task.time * 6.0
  angleradians = angledegrees * (math.pi / 180.0)
  base.camera.setPos(20*math.sin(angleradians),-20.0*math.cos(angleradians),3)
  base.camera.setHpr(angledegrees, 0, 0)
  return Task.cont

taskMgr.add(SpinCameraTask, "SpinCameraTask")


Начинаем разбор полетов :) 

def SpinCameraTask(task): - определение переменной SpinCameraTask, (task) - обозначение ее выполнения как задание.

Строки:

angledegrees = task.time * 6.0

  angleradians = angledegrees * (math.pi / 180.0)


отвечают за градус поворота камеры за секунду (1 строка), а также обозначение данной величины в радианах (вторая строка). Самое интересное что одно без другого не существует в данном движке, странно :/

Строки:

base.camera.setPos(20*math.sin(angleradians),-20.0*math.cos(angleradians),3)

  base.camera.setHpr(angledegrees, 0, 0)



отвечают за установку камеры под опр. углом (строка 1, задаются параметры движения в 3х плоскостях под опр углом. Чтобы понять смысл сего выражения, попробуйте изменить величину "20*math.sin" скажем на 120 :) ) и за начальную ориентацию камеры в пространстве(2 строка, использует значение угла поворота камеры angledegrees).

Так как подпрограмма SpinCameraTask непрерывно возвращает значени константы нашего задания (то есть угла поворота камеры), то менеджер заданий будет вызывать значение переменной в каждом кадре при рендере. Об этом свидетельствует строка: 

taskMgr.add(SpinCameraTask, "SpinCameraTask") 

Если вы проследили мысль данного кода то становится понятно для чего была эта суета с углами и прочей ересью... в конце концов мы задали задание для менеджера заданий с определенным именем и определенной переменной, поздравляю :)

Теперь весь исходный код программы будет иметь вид:

#importing part
import direct.directbase.DirectStart
from direct.task import Task
import math


#Load the first environment model
envirom = loader.loadModel("models/environment")
envirom.reparentTo(render)
envirom.setScale(0.25,0.25,0.25)
envirom.setPos(-8,42,0)

#Task to move the camera
def SpinCameraTask(task):
  angledegrees = task.time * 6.0
  angleradians = angledegrees * (math.pi / 180.0)
  base.camera.setPos(20*math.sin(angleradians),-20.0*math.cos(angleradians),3)
  base.camera.setHpr(angledegrees, 0, 0)
  return Task.cont

taskMgr.add(SpinCameraTask, "SpinCameraTask")


#Run the tutorial
run()



С уважением, Dredd.

Комментариев нет:

Отправить комментарий