Главная » Статьи » Учебник: теория

Поиск в сцене
Очень часто бывает необходимо найти узел (нод) или часть модели. Ниже мы рассмотрим несколько методов, посвященных этому.
Первая и наиболее часто используемая команда ls():

myNodePath.ls()

Команда выводит список всех чайлдов указанного NodePath. Так же она показывает трансформации и эффекты рендеринга каждого чайлда.
Два метода find() и findAllMatches() возвращают NodePath и NodePathCollection соответственно. Методы требуют строку в качестве аргумента. Поиск может базироваться на имени или типе. В простейшем случае эта строка содержит серию имён узлов, разделённых слешами — наподобие пути к файлу. При задании строки вместо имени любого узла могут быть использованы следующие специальные имена.

* Соответствует одному узлу с любым именем
** Соответствует любой последовательности узлов, начиная с 0
+typename Соответствует любому узлу, производному от данного типа
-typename Соответствует любому узлу, исключая узлы указанного типа
=tag Соответствует любому узлу, помеченному тегом
=tag=value Соответствует любому узлу, чей тег соответствует значению

Стандартные условные символы, такие как *, ?, и [a-z] так же могут использоваться. @@ специальный символ перед именем узла, что данный конкретный узел спрятан. Обычно такие узлы не включаются в возвращаемое значение, соответственно для их поиска используется @@*.
Аргумент может сопровождаться контрольными флагами. Для этого после аргумента ставится точка с запятой и указываются необходимые флаги

-h Не возвращать невидимые узлы (невидимые и спрятанные узлы — это разные вещи)
+h Возвращать невидимые узлы
-s Не возвращать спрятанные узлы, если не указан префикс @@
+s Возвращать спрятанные узлы независимо от указания @@
-i Регистрозависимое сравнение имён узлов
+i Сравнение имён узлов независимо от регистра символов. Этот флаг влияет только на имена узлов. Типы и теги узлов по прежнему будут регистрозависимы.

По умолчанию флаги соответствуют +h-s-i.

Метод find() возвращает единственный узел, соответствующий поисковой строке. Если соответствй несколько, то возвращается кратчайшее. Если ничего не найдено, то возвращается пустой NodePath. Другой вариант - findAllMatches() возвращает все найденные NodePath.

myNodePath.find("")
myNodePath.findAllMatches("")

Несколько примеров:

myNodePath.find("house/door")

Ищет узел с именем "door", являющийся чайлдом узла "house", который в свою очередь является чайлдом myNodePath.

myNodePath.find("**/red*")

Ищет любой узел в дереве узлов, начиная от myNodePath с именем, начинающимся на "red".
Дополнительно есть методы getParent() и getChildren(). getParent() возвращает NodePath родительского узла. getChildren() возвращает чайлды текущего узла как NodePathCollection ( если нужно получить их как список, то используйте getChildrenAsList()).

getChildrenAsList пример

for child in myNodePath.getChildrenAsList():
print child

Ещё пример:

#если мы хотим найти определённый узел, идя вверх по дереву узлов
while myNodePath.getParent()!=someAncestor:
myNodePath=myNodePath.getParent()

Категория: Учебник: теория | Добавил: ninth (16.02.2009)
Просмотров: 4838 | Комментарии: 12 | Рейтинг: 4.0/2
Всего комментариев: 121 2 »
1  
Допустим есть файл .egg в котором находятся, например два бокса(box).
Как в панде назначить эти боксы двум разным NodePath ?

2  
model=loader.loadModel("test")
model.reparentTo(render)
np1=model.find("**/Cube.001")
np1.setPos(0,0,3)
np2=model.find("**/Cube")
np2.setPos(0,0,-3)

3  
Спасибо Ninth

4  
Почему метод getChildrenAsList возвращает только последнюю группу в файле ? Как получить весь список ?

5  
приведи весь код загрузки и получения, а лучше выкинь на форуме целиком пример

6  
Сэтим разобрался. Теперь мне не понятно как получить список всех объектов, включая те которые являются child объектами по отношению к некоторым из групп файла. Получить сразу весь список , всех объектов

7  
Я ЗАПАРИЛСЯ... wacko

8  
Рекурсию придётся или что-то подобное - проход по всем чайлдам, потом по всем чайлдам чайлдов и т.д. если я правильно понял чего ты хочешь

9  
А как получить абсолютную позицию child объекта

10  
ls() дает информацию обо всех объектах. Но как ей воспользоваться ?

1-10 11-12
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Онлайн всего: 1
Гостей: 1
Пользователей: 0