среда, 7 января 2009 г.

Пример 1.4: Динамическая непрерывная анимация, использование интервалов

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

Добавим в сегмент импорта библиотек и классов следующие строки:

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.

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

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