Надеюсь, у вас сохранился код от примера 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.
Комментариев нет:
Отправить комментарий