[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Форум Panda3D - по русски » Panda3D » Общие вопросы » взять координаты объекта
взять координаты объекта
ninthДата: Понедельник, 24.06.2013, 14:38 | Сообщение # 31
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
1. Без примера - я вряд ли что-то скажу. Надо смотреть
2. Можешь ссылку дать где это на форуме обсуждается?
 
akzyДата: Понедельник, 24.06.2013, 20:24 | Сообщение # 32
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
*имел ввиду,что начал искать похожие вопросы на форуме, если не найду, открою тему.
Код прикреплён. Заранее извиняюсь за кривость и неорганизованность.
На текущий момент не понимаю, почему при удалении и создании ноды коллизии, её координаты остаются прежними (кнопка b) , так же со временем падает производительность... 
судя по производительности, основной затык у меня сейчас с коллизиями (можно сделать кучу кубиков кнопкой g,это не сильно повлияет на работу, но стоит включить коллизии, всё падает с 600 до 120 fps)
Прикрепления: moo.zip (387.5 Kb)


Сообщение отредактировал akzy - Понедельник, 24.06.2013, 23:08
 
ninthДата: Вторник, 25.06.2013, 11:54 | Сообщение # 33
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Во-первых, процедура collider2 у тебя создаёт помимо куба и луча много ещё чего интересного: CollisionTraverser, CollisionHandlerQueue, mouseTask2 а удаляешь ты только куб и луч, забыв удалить и почистить всё остальное. соответственно оно пытается продолжать работать. Вообще тебе не надо каждый раз создавать collider2 целиком - достаточно пересоздать cnpquad в нужном месте или вообще просто передвинуть его. Это что касалось падения производительности со временем.
т.е. в идеале у тебя вся процедура выглядит так:
Код
def addcube(self):
           self.collider.cnpquad.setPos(self.x,self.y,self.z)


Цитата (akzy)
почему при удалении и создании ноды коллизии, её координаты остаются прежними

Здесь я вижу две ошибки:
1. Ты сам вместо того чтобы создать стандартный куб и потом сместить его в нужную позицию, - смещаешь вершины куба, а центр модели остаётся в 0 0 0. Не знаю насколько понятно объяснил. Если не понятно могу попробовать нарисовать что происходит. Хотя в данном случае в принципе это не влияет на твой алгоритм, т.к. ты учитываешь не позицию задетектенного куба, а точку и нормаль коллизии.
2. Неправильное округление в updxyz. Ты округляешь позицию до десятков, а не до единиц т.е. любая цифра меньше 5.0 превращается в 0.

Теперь к фпсам - это довольно хитрая штука. Вычисление коллизий конечно довольно прожорливая операция сама по себе, но тут ещё пара моментов делают то, что называется "у страха глаза велики"
Фпсы - не линейная величина. Т.е. при 500 фпсах разница в 1 фпс - это 0.002 секунды процессорного времени, а при 100 фпсах - это уже 0.01 секунды. Это было раз, а два - смотри что происходит - чем больше фпсов, тем чаще вызывается у тебя процедура расчёта коллизий и тем больше суммарно времени на неё тратится. В данном случае есть смысл попробовать вместо автоматического base.cTrav использовать свой траверсер и вызывать его скажем 10-20 раз в секунду через taskMgr.doMethodLater и task.again
 
akzyДата: Среда, 26.06.2013, 12:05 | Сообщение # 34
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
Насчёт коллизий в отдельную задачу, да, чтото не догадался сразу, сделал проверку 10 раз в секунду, фпс вырос значительно (~2-3 раза)
насчёт первой ошибки- возможно чтото пропустил опять, но почему при показываемых координатах грани например -1, куб ставится в 0?то есть в начале подвожу курсор к левой грани, координата х=0, жму b, куб смещается, двигаю мышку на ту же грань, координата -1, жму b, нет реакции, тк координата берётся не -1 а 0...
пойду ещё почитаю...
Округляется у меня до единиц и всё работает. По крайней мере в выводе значений всё   отображается нормально. Может мне мои скрины выложить?
ps чтобы куб смещать, целиком,. его прицепить к ноде?


Сообщение отредактировал akzy - Среда, 26.06.2013, 12:08
 
ninthДата: Среда, 26.06.2013, 17:29 | Сообщение # 35
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
Твой код
Код
        self.x=round(self.collider.acp[0],-1)+self.nx
         self.y=round(self.collider.acp[1],-1)+self.ny
         self.z=round(self.collider.acp[2],-1)+self.nz

В каком месте здесь округление до единиц? Или это может у меня какой-то особый питон?
Код
>>> round(4.5, -1)
0.0
>>> round(5.5, -1)
10.0
>>> round(-1, -1)
-0.0


Цитата (akzy)
ps чтобы куб смещать, целиком,. его прицепить к ноде?

В предыдущем посте показан рабочий пример addcube - просто попробуй его в своём коде
 
akzyДата: Среда, 26.06.2013, 17:36 | Сообщение # 36
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
попробовал, вот скриншоты

на каждом курсор на левой грани
ps картинки справа налево идут
Прикрепления: 8750834.jpg (34.4 Kb) · 1353085.jpg (35.5 Kb)


Сообщение отредактировал akzy - Среда, 26.06.2013, 17:37
 
ninthДата: Среда, 26.06.2013, 17:54 | Сообщение # 37
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
К чему эти скрины? Я не совсем понял. Про рабочий пример - я говорил о том как смещать куб целиком, тем не менее до этого я сказал, что
Цитата (ninth)
в данном случае в принципе это не влияет на твой алгоритм
.

С твоим алгоритмом ошибка в округлении. Т.е. либо поправь округление, либо считай тогда по позиции куба.
 
akzyДата: Среда, 26.06.2013, 22:07 | Сообщение # 38
Лейтенант
Группа: Пользователи
Сообщений: 55
Награды: 0
Репутация: 3
Статус: Offline
да, сейчас сделал пару тестов, ошибку нашёл. 
working out...
 
Форум Panda3D - по русски » Panda3D » Общие вопросы » взять координаты объекта
  • Страница 3 из 3
  • «
  • 1
  • 2
  • 3
Поиск: