В этом примере мы рассмотрим перемещение панды по отображаемой сцене с помощью интервалов. Интервалы это задача по изменению значения параметра за определенный промежуток времени. При старте интервала запускается "закулисный :)" процесс, который преобразует значение параметра за опр. временной промежуток. Теперь разберем нововведения в коде программы.
Добавим в сегмент импорта библиотек и классов следующие строки:
from pandac.PandaModules import *
from direct.interval.IntervalGlobal import *
Здесь мы импортируем все доступные классы и методы из вышеприведенных модулей для применения интервалов.
Код импорта:
#importing part
import direct.directbase.DirectStart
from pandac.PandaModules import *
from direct.actor import Actor
from direct.task import Task
from direct.interval.IntervalGlobal import *
import math
Теперь добавим непосредственные изменения в код. Для этого после строки "panda.loop("walk")" добавляем:
#Create the four lerp intervals needed to walk back and forth
pandaPosInterval1= panda.posInterval(13,Point3(0,-10,0), startPos=Point3(0,10,0))
pandaPosInterval2= panda.posInterval(13,Point3(0,10,0), startPos=Point3(0,-10,0))
pandaHprInterval1= panda.hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))
pandaHprInterval2= panda.hprInterval(3,Point3(0,0,0), startHpr=Point3(180,0,0))
#Create and play the sequence that coordinates the intervals
pandaPace = Sequence(pandaPosInterval1, pandaHprInterval1,
pandaPosInterval2, pandaHprInterval2, name = "pandaPace")
pandaPace.loop()
В первом фрагмене кода с помощью параметров "pandaPosInterval" мы определяем точки старта и конца отрезка для движения панды, а также точки поворота и ее возврата в исходное положение. Теперь немного конкретизирую.
В первой строка показана скорость движения панды по оси Y( начальное значение (0,10,0) и конечное (0,-10,0)) - 13 сек. Вторая же строка проводить обратную по логике операцию, то бишь возвращает панду "домой" :).
Третья и четвертая строка определяют с помоцью функции panda.hprInterval() вращение модели на определенный угол (в данном случаем полный поворот - 180 градусов, вокруг оси Х с интервалом в 3 сек).
Второй сегмент нового кода задает "последовательность" поведения операций. По логике тут все наглядно что за чем будет следовать :). Но все таки распишу : pandaPosInterval1, pandaHprInterval1, pandaPosInterval2, pandaHprInterval2 имя данной последовательности припишем "pandaPace". Внимательно прочитав предидущие примеры не трудно понять что последняя строка кода отвечает за непрерывное выполнение данной последовательности.
Исходный код всей программы:
#importing part
import direct.directbase.DirectStart
from pandac.PandaModules import *
from direct.actor import Actor
from direct.task import Task
from direct.interval.IntervalGlobal import *
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")
#Import Panda and its animation
panda = Actor.Actor("models/panda-model",{"walk":"models/panda-walk4"})
panda.setScale(0.005,0.005,0.005)
panda.reparentTo(render)
panda.loop("walk")
#Create the four lerp intervals needed to walk back and forth
pandaPosInterval1= panda.posInterval(13,Point3(0,-10,0), startPos=Point3(0,10,0))
pandaPosInterval2= panda.posInterval(13,Point3(0,10,0), startPos=Point3(0,-10,0))
pandaHprInterval1= panda.hprInterval(3,Point3(180,0,0), startHpr=Point3(0,0,0))
pandaHprInterval2= panda.hprInterval(3,Point3(0,0,0), startHpr=Point3(180,0,0))
#Create and play the sequence that coordinates the intervals
pandaPace = Sequence(pandaPosInterval1, pandaHprInterval1,
pandaPosInterval2, pandaHprInterval2, name = "pandaPace")
pandaPace.loop()
#Run the tutorial
run()
На этом заканчивает первый, приведенный мной, пример по основам работы в Panda3D. Какового его практическое применение (а оно всегда должно быть)? Конечно же это "презентация" чего - либо в трехмерном пространстве. Как вы видите, не так уж и сложно творить, главное только научиться применять для этого инструменты. В дальнейших примерах я постараюсь вместе с вами постигать постепенно Python и Panda3D в их отдельных элементах разработки.
С уважением, Dredd.