Загрузка статики
Загрузка статической модели в Панде осуществляется процедурой loader.loadModel
m =
loader.loadModel('mymodel.egg')
Путь к модели может быть как
абсолютным, так и относительным. Если используется относительный путь, то панда
будет искать модели относительно model path, прописанного в конфигурационном
файле. Не забывайте, что загрузка модели сама по себе не сделает модель
видимой, для этого её нужно поместить в граф сцены
m.reparentTo(render)
О графе сцены вы может прочесть больше в соответствующей главе
учебника Синтаксис имени файла В целях лучшей переносимости программ
на разные системы - *nix, Windows, Mac - панда использует соглашение по
которому все имена и пути файлов пишутся в стиле Unix. Это означает, что все
слеши являются прямыми и отсутствует префикс диска (для указания диска
используется лидирующий однобуквенный каталог). Пример конвертации пути
Windows в путь, воспринимаемый Пандой:
# НЕВЕРНО: loader.loadModel("c:\\Program
Files\\My Game\\Models\\Model1.egg")
#
ВЕРНО: loader.loadModel("/c/Program Files/My
Game/Models/Model1.egg")
Панда использует класс
Filename для хранения имени файла в своём стиле. Многие функции ожидают в
качестве передаваемого параметра объект типа Filename. Этот класс так же
содержит некоторые дополнительные методы, позволяющие манипулировать путями и
получать доступ к файлам. Для полной информации нужно заглянуть в справочник API
функций панды. Примеры преобразования с помощью класса Filename:
from
pandac.PandaModules import Filename winfile =
"c:\\MyGame\\Model1.egg" pandafile =
Filename.fromOsSpecific(winfile) print pandafile
from
pandac.PandaModules import Filename pandafile =
Filename("/c/MyGame/Model1.egg") winfile = pandafile.toOsSpecific() print
winfile
Класс Filename может быть использован совместно со
встроенными в питон механизмами работы с файлами. Скажем, вы хотите загрузить
модель, находящуюся в директории models? Которая в свою очередь находится там
же, где и основной исполняемый файл: import sys,os from
pandac.PandaModules import Filename
# получаем путь к основному файлу
скрипта: mydir = os.path.abspath(sys.path[0])
# конвертируем в
соответствии с требованиями панды mydir =
Filename.fromOsSpecific(mydir).getFullpath()
# и загружаем
модель model = loader.loadModel(mydir +
"/models/mymodel.egg")
Помните, что стандартные функции
питона (например os.remove()) работают с путями, характерными для операционной
системы. Не забывайте конвертировать пути при использовании встроенных функций
питона.
Загрузка анимированных моделей
Класс Actor
предназначен для хранения анимированных моделей и анимаций. Actor наследует
свойства NodePath, все методы NodePath применимы к классу Actor.
Замечание - Actor класс питона, расширяющий C++ класс NodePath. Обычно он
выполняет то, что вы ожидали. Однако, есть несколько нюансов. Когда вы
прикрепляете актёра к графу сцены, изкоуровневая C++ панда создаёт только запись
NodePath в графе сцены, который существует до тех пор пока вы храните указатель
на актёра в объектах питона. Если вы разрушите актёра — то всего лишь
прекратится его анимация (т. к. это больше не актёр), а видимая геометрия
останется. Кроме того, даже если у вас есть объект типа Актёр и вы получите
новый указатель на него из графа сцены (например при коллизиях), то это будет
обычный указатель на NodePath, а не на актёра. Actor предоставляет
высокоуровневый интерфейс к низкоуровневым конструкциям панды. В панде
низкоуровневый узел (нод), выполняющий анимацию называется Character. Вы можете
увидеть Character node в графе сцены вызвав actor.ls(). Не путайте класс
Actor с классом ActorNode,который используется в физике. Это полностью разные
классы с различными именами. Перед любыми действиями мы должны
импортировать модуль
from direct.actor.Actor import
Actor
Как только модуль загружен, мы можем работать с моделью и
анимацией:
nodePath
= Actor() nodePath.loadModel(‘Model Path’) nodePath.loadAnims({‘Arbitrary
Name1’:’Animation Path 1’}) nodePath.loadAnims({‘Arbitrary Name2’:’Animation
Path 2’})
Загрузка каждой анимации требует кортеж, состоящий из
имени анимации и имени файла анимации. Предыдущая операция может быть выполнена
одной строкой: nodePath = Actor('Model Path',
{ 'Animation Name 1':'Animation Path 1', 'Animation Name 2':'Animation
Path 2', })
Анимация так же может быть выгружена, используя
такой же кортеж как и при загрузке.
nodePath.unloadAnims({'Animation Name':'Animation
Path'})
Хотя это редко используемая техника, но есть
возможность загрузки актёра из нескольких частей — о чём будет рассказано в
части учебника о составных актёрах. Панда поддерживает как скелетную, так и
вершинную анимацию (морфинг).
|