[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 11
Форум Panda3D - по русски » Panda3D » Для начинающих » NodePath
NodePath
dis_nodeДата: Пятница, 25.03.2011, 20:39 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 56
Награды: 0
Репутация: 2
Статус: Offline
Метод showBounds () показывает что BoundingVolume конкретно смещен относительно геометрии. Есть методы регенерации (типа "хоп и он на месте") или нужно выравнивать вручную?

getTightBounds() - где-нить документируется ? У BoundingVolume вроде нет методов возвращающих координаты, откуда че цепляется ?

Сообщение отредактировал dis_node - Пятница, 25.03.2011, 20:41
 
ninthДата: Суббота, 26.03.2011, 11:05 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Можешь скрин дать или пример модельки? Я с таким не сталкивался. Было как-то надо вернуть центр нода в геометрический центр - я пользовался вот такой процедуркой.

pt1,pt2 = np.getTightBounds()
gcenter = (pt1+pt2)*0.5
gcenter = gcenter - np.getPos()
np.setPos(-gcenter)
np.flattenLight()
np.setPos(gcenter)

Есть ещё calcTightBounds, но возвращаемые результаты вроде не отличаются. В чём различия кроме способа вызова - я х.з.
p1,p2 = Point3(), Point3()
np.calcTightBounds(p1,p2)
print p1,p2
p1,p2 = np.getTightBounds()
print p1,p2

 
dis_nodeДата: Суббота, 26.03.2011, 20:25 | Сообщение # 3
Лейтенант
Группа: Пользователи
Сообщений: 56
Награды: 0
Репутация: 2
Статус: Offline
проглядел, есь forceRecomputeBounds ()

np.setPos(-gcenter) - перемещает весь узел (не отдельно центр, отдельно геометрию) т.е. смещение так и останется.
np.flattenLight() - переводит трансформации непосредственно в координаты?
если calcTightBounds(p1,p2) и getTightBounds() - одно и тоже вторая наверно устарела, как и мануал)

Прикрепления: bounds.zip(9Kb)


Сообщение отредактировал dis_node - Суббота, 26.03.2011, 20:44
 
ninthДата: Воскресенье, 27.03.2011, 00:26 | Сообщение # 4
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Quote (dis_node)
смещение так и останется.

Да, но геометрический центр узла помещается в координаты (0,0,0). После этого flattenLight применяет текущие трансформации (смещение, масштаб, поворот) непосредственно к вершинам, а трансформации самого узла обнуляются. В конце объект возвращается на место.
Побочным эффектом является обнуление масштаба и поворота, точнее не обнуление, а перенос этого дела на вершины, но для меня это было не критичным.
А вообще задача флаттенов - уменьшение количества операций трансформации узла -> увеличение производительности. флаттенСтронг вроде ещё и геометрию объединяет, уменьшая кол-во узлов, но точно не скажу - не экспериментировал.
 
dis_nodeДата: Воскресенье, 27.03.2011, 00:59 | Сообщение # 5
Лейтенант
Группа: Пользователи
Сообщений: 56
Награды: 0
Репутация: 2
Статус: Offline
forceRecomputeBounds(), flattenLight() - не проканало
Прикрепления: 5959808.png(3Kb)


Сообщение отредактировал dis_node - Воскресенье, 27.03.2011, 16:32
 
ninthДата: Воскресенье, 27.03.2011, 16:39 | Сообщение # 6
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Попробуй использовать getTightBounds() и showTightBounds()
А вообще что за финт c пустым TextNode для генерации плоского фрейма? Обычно для этого используют CardMaker
Code
cm = CardMaker('zzz')
cm.setFrame(0.0,0.3,0.0,0.3)
cmnp = aspect2d.attachNewNode(cm.generate())
cmnp.setTexture(loader.loadTexture('control_template.png'))
cmnp.showBounds()
 
dis_nodeДата: Воскресенье, 27.03.2011, 23:36 | Сообщение # 7
Лейтенант
Группа: Пользователи
Сообщений: 56
Награды: 0
Репутация: 2
Статус: Offline
Сделал так, но после принудительной установки вроде отрубается автоматический пересчет.
...
p1,p2=Point3(),Point3()
temp_np=NodePath(lblImg)
temp_np.flattenStrong()
temp_np.calcTightBounds(p1,p2)
bv=BoundingBox(p 1,p2)
lblImg.setBounds(bv)
...
TextNode не только для фрейма, но и для текста - элемент гуя 'метка' (lable). PGItem это уже надстройка, без прямого доступа к тексту и текстуре, реакция на события здесь не нужна.
 
ninthДата: Понедельник, 28.03.2011, 08:06 | Сообщение # 8
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Да, по-идее отрубится. Но зачем тебе его ещё и так устанавливать, если TightBounds даёт то, что нужно? Или ты что-то хочешь на это привязать кроме получения размеров?
 
dis_nodeДата: Понедельник, 28.03.2011, 22:52 | Сообщение # 9
Лейтенант
Группа: Пользователи
Сообщений: 56
Награды: 0
Репутация: 2
Статус: Offline
Здесь - ничего, но в целом напрягает что криво висит и наверняка где-нить эта хрень всплывет. В идеале нужно типовое решение типа 'встретил-пофиксил-забыл' или не дожидаясь огульно переустанавливать.
 
dis_nodeДата: Суббота, 02.04.2011, 13:38 | Сообщение # 10
Лейтенант
Группа: Пользователи
Сообщений: 56
Награды: 0
Репутация: 2
Статус: Offline
Опять BoundingVolume

Bounds - БВ
Автоматический - auto
Принудительная установка - handl
Локальный объем - intrnl

Я устанавливал БВ TextNode'ов тремя способами, как видно из рисунка.

1. В случае auto и intrnl режимов, БВ соответствует только тексту. При выходе БВ за пределы обзора
картинка все еще видна. Каким образом БВ участвует в отсечении невидимых объектов ?

2. При использовании оъекта для инициалзации PGButton, в случае автоматичского объема активные зоны (область клика)
общитываются отдельно для текста и картинки. В случае предустановленного объема активная зона общая. Как быть если графика
не пересекается, а активные зоны пересекаются, гуи-элементы должны всегда быть параллельны осям? Какой принцип определения
активной зоны? Активная зона - синяя рамка, первый рисунок.

3. Для handl режима, при смещении объекта на 1.0 становится заметным не пропорциональное смещение БВ, пересчет не помог,
в чем ошибка? При этом активная зона общитывается корректно.

setBounds() не полностью отключает автоматтический пересчет, масштаб меняется при трансформации (поворот).
Код следующим постом.

Прикрепления: 9328668.png(12Kb) · 0308655.png(13Kb) · 8240667.png(9Kb)


Сообщение отредактировал dis_node - Суббота, 02.04.2011, 13:50
 
dis_nodeДата: Суббота, 02.04.2011, 13:44 | Сообщение # 11
Лейтенант
Группа: Пользователи
Сообщений: 56
Награды: 0
Репутация: 2
Статус: Offline
Кодец
Прикрепления: text_bounds_cli.zip(52Kb)


Сообщение отредактировал dis_node - Воскресенье, 03.04.2011, 00:46
 
ninthДата: Суббота, 02.04.2011, 15:09 | Сообщение # 12
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
В архиве test_TextNode2 скомпиленный (pyc) поэтому посмотреть не могу.
Для ручного БВ попробуй после установки поставить setFinal(1)
По процессу рендеринга я, к сожалению знаю не больше чем написано в мануале, поэтому как он рендерит при выходе из БВ сказать не могу. Есть у меня подозрение, что он смотрит на БВ каждого чайлда отдельно.
 
dis_nodeДата: Воскресенье, 03.04.2011, 00:48 | Сообщение # 13
Лейтенант
Группа: Пользователи
Сообщений: 56
Награды: 0
Репутация: 2
Статус: Offline
перезалил (там же)

setFinal(1) -устанавливал, никакого эффекта.
Получается у TextNode'аРоль родительский БВ может быть меньше объекта в целом, мож это особенность. Как с составными моделями (типа актера), экспериментил ?

Сообщение отредактировал dis_node - Воскресенье, 03.04.2011, 01:05
 
ninthДата: Воскресенье, 03.04.2011, 16:06 | Сообщение # 14
Admin
Группа: Администраторы
Сообщений: 1554
Награды: 5
Репутация: 46
Статус: Offline
Попробуй так
ll = self.np.getRelativePoint(aspect2d,ll)

ur = self.np.getRelativePoint(aspect2d,ur)

 
Форум Panda3D - по русски » Panda3D » Для начинающих » NodePath
Страница 1 из 11
Поиск: