[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 2 из 3«123»
Форум Panda3D - по русски » Общий форум » Проекты » Демо игра "Танки" (типа физ движок)
Демо игра "Танки"
ninthДата: Четверг, 29.07.2010, 08:34 | Сообщение # 16
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Вот поэтому я и говорил о том чтобы вынести танк в отдельный класс ) У тебя разные настройки коллизий для ботов и для игрока ) По хорошему должен быть общий класс танка и некоторые методы управления им - типа ехать вперёд, стрелять и т.д., только игрок воздействует на эти методы своего танка с помощью клавы/мыши, а ботами управляет комп, при этом все танки лучше загнать в общий массив чтобы делать проверку сразу для всех и не искать в дальнейшем почему, например игрок в ботов попадает, а боты в игрока - нет.

По поводу тормозов коллизий. Можно попробовать вообще выкинуть пушер т.к. шар может вызывать лишние коллизии. Пушер хорошо использовать в простых случаях, если же ты хочешь сделать хотя бы подобие физики, то лучше считать вручную. Попробуй работать не со сферами а с отрезками, расположенными по углам.

При этом обрабатывать вручную как с лучом "в пол" - можно реализовать не только смещение танка, а например при коллизии с угловым лучом - разворачивать танк + смешать не только танк в который врезались, но и замедлять и смещать танк который врезался.
Дополнительно можно это оптимизировать, например если скорости относительно небольшие, можно например вызывать цикл обработки коллизий не каждый кадр а раз в n кадров или в задаче, которая повторяется n раз в секунду, а результат интерполировать.

Прикрепления: 8251233.gif(1Kb)
 
LunarДата: Четверг, 29.07.2010, 13:16 | Сообщение # 17
Рядовой
Группа: Пользователи
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
Спасибо буду разбираться.
Да у меня боты свой поворот считают раз в несколько секунд, с запуском задачи по дельте времени разобрался очень мощная штука, два таких цикла и можно оптимизировать скорость... этот прием еще с флеша известен мне... там тоже приходится бороться с производительностью smile
А я и не спорю про классы... тогда еще не надо было... надо было просто завести а сейчас в се в классах но пока коряво не спорю smile ... есть еще проблема smile
Добавил вариант загрузки карты по битмапу. Но сразу же возникла проблема, по старому способу вектора нормалей не читаются и вообще ошибка происходит (этот кусок кода я в try засунул). Подскажи как с такой карты нормали вытягивать?

Добавлено (29.07.2010, 13:16)
---------------------------------------------
К стати вот тут подумалось, а отрезки с чем коллидится будут если в случае танк - танк?
Получается что для отрезка нужно добавить setFromCollideMask объектов на карте и саму карту и танки, то есть всем этим объектам надо ставить одну и туже маску?
Со своим танком эти отрезки не будут коллидиться потому что они на расстоянии все время я так понимаю, а как только этот отрезок упрется в другой объект и у него будет прописано <Collide> { Polyset keep descend } тогда я могу получить от коллидера какие то данные, вопрос какие, то есть что ожидать от этого?

Прикрепления: exit_005.zip(830Kb)


Сообщение отредактировал Lunar - Четверг, 29.07.2010, 13:18
 
ninthДата: Четверг, 29.07.2010, 16:20 | Сообщение # 18
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Хм, убрал try - ничего не ругается, повесил вывод нормали - вроде всё ок. Можешь текст ошибки кинуть?

Quote (Lunar)
К стати вот тут подумалось, а отрезки с чем коллидится будут если в случае танк - танк?

На танк сделай коллидящуюся геометрию или напрямую маску повесь, первое лучше.

Quote (Lunar)
вопрос какие, то есть что ожидать от этого?

те же самые - нормаль и точку коллизии, по ним и определяй что делать, можешь ещё и теги получать. По нормали определять в какую сторону нужно отталкиваться, по точке коллизии - нужно ли или мы ещё относительно далеко.
 
LunarДата: Четверг, 29.07.2010, 16:44 | Сообщение # 19
Рядовой
Группа: Пользователи
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
Код ошибки... это у ботов
Code

Traceback (most recent call last):
   File "D:\develop\python\panda\tanki\exit\exit_005\modules\bot.py", line 197, in move
     angleH=(180*entries[0].getInto().getNormal().getX())/3.1415
AttributeError: 'libpanda.CollisionSphere' object has no attribute 'getNormal'
Traceback (most recent call last):
   File "D:\develop\python\panda\tanki\exit\exit_005\main.py", line 96, in <module>
     run()
   File "D:\Panda3D-1.6.2\direct\showbase\ShowBase.py", line 2423, in run
     self.taskMgr.run()
   File "D:\Panda3D-1.6.2\direct\task\TaskNew.py", line 471, in run
     self.step()
   File "D:\Panda3D-1.6.2\direct\task\TaskNew.py", line 429, in step
     self.mgr.poll()
   File "D:\develop\python\panda\tanki\exit\exit_005\modules\bot.py", line 197, in move
     angleH=(180*entries[0].getInto().getNormal().getX())/3.1415
AttributeError: 'libpanda.CollisionSphere' object has no attribute 'getNormal'

Совет нужен. Я тут заметил что на ноуте fps 28, на настольном компе 60, (когда меньше ботов то и 200), так вот запускаю на обоих машинах и вижу что из точки А в точку Б приезжают они не одновременно, тоесть на ноуте скорость передвижения падает ну потому что проц не успевает обработать все что есть в менеджере (по этому и FPS падает). Как можно это дело синхронизировать, а то получается два одинаковых танка а скорости разные, так никакого онлайна не получится...
И так резюмирую - как добиться того чтобы скорость передвижения модели не менялась от скорости расчетов процессора.
Например пропуск кадров рендера что-ли...

Добавлено (29.07.2010, 16:36)
---------------------------------------------

Quote (ninth)
Хм, убрал try - ничего не ругается, повесил вывод нормали - вроде всё ок. Можешь текст ошибки кинуть?

поворот есьт но очень маленьки практичеки никакой, у тебя танк поворачивается по поверности?

Добавлено (29.07.2010, 16:44)
---------------------------------------------
с этой ошибкой я разобрался я не правильно маски ставил... А вот поворот по террану не работает...

 
ninthДата: Четверг, 29.07.2010, 16:47 | Сообщение # 20
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
'libpanda.CollisionSphere' object has no attribute 'getNormal'
у тебя луч почему-то втыкается в сферу-пушер, а не в хейтмэп, проверь положение сфер. Для теста можешь на сферы ботов сделать маску into allOff.

Quote (Lunar)
И так резюмирую - как добиться того чтобы скорость передвижения модели не менялась от скорости расчетов процессора

используй globalClock.getDt() - возвращает время между двумя кадрами. Обычно на это время умножается скорость чтобы добиться одинакового перемещения при разных фпс
 
LunarДата: Четверг, 29.07.2010, 17:14 | Сообщение # 21
Рядовой
Группа: Пользователи
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
В общем вот последний вариант не глючит все ок, можно грузить две карты разные, надо только ремарки убрать в оном месте и поставить в другом в файле main.py, по коду видно. Для первой карты с пандусом повороты по нормалям к поверхности работают, а вот на второй карте повороты не работают, точнее поворот есть чуть чуть визуально но это считай что нет... Пытался умножать на коэффициент нормаль но получалась какая то чушь.

Добавлено (29.07.2010, 17:06)
---------------------------------------------
за globalClock.getDt() спасибо сработало на ноуте даже быстрее в точку приезжает smile ну большой комп правильнее считает, думаю если скорость уменьшить то совсем одинаково будет.

Добавлено (29.07.2010, 17:14)
---------------------------------------------
я включил base.cTrav.showCollisions(render) и на глаз вижу что нормаль нифига не нормаль.... чуть чуть есть отклонение но она не нормаль...

Прикрепления: exit_006.zip(395Kb)
 
ninthДата: Четверг, 29.07.2010, 19:27 | Сообщение # 22
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
попробуй после генерации террайна сделать getRoot().flattenLight()
или дели z составляющую нормали настолько, насколько у тебя хейтмапа масштабирована по z, а после нормализуй полученную нормаль n.normalize() - нормализация, если что не возвращает результат, а работает над вектором из которого вызвана.
 
LunarДата: Пятница, 30.07.2010, 10:29 | Сообщение # 23
Рядовой
Группа: Пользователи
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
Ну вроде все понятно буду копать дальше.
Только заметил одну вещь, делаю так:
Code

self.root = self.terrain.getRoot()
self.root.flattenLight()  
self.root.setSx(0.5)
self.root.setSy(0.5)
self.root.setSz(0.5)

у меня хейтмапа обрезается по периметру на сколько я понял и появляется кучка кусков карты (видимо те что обрезаны были), в одном из углов карты,
а если делать
Code
self.root.flattenStrong()

то обрезается на много больше и кучка становится больше.
Это что за глюки не знаешь?
Да и вообще масштабирование на хейтмап как-то странно действует.
И еще, есть другие варианты текстурирования хейтмапы? Просто делать четкую текстуру на heightfield размером 257/257 надо как минимум 3000/3000 но это аж 16 метров, и то по качеству не фонтан. что подскажешь из простого?
 
ninthДата: Пятница, 30.07.2010, 13:51 | Сообщение # 24
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Соррь, про флаттен я не совсем верно выразился, делать его надо не сразу после генерации, а после всех трансформаций, которые ты на карту наложил - это "запечёт" трансформации и приведёт данные к нормальному виду.

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

 
LunarДата: Пятница, 30.07.2010, 17:02 | Сообщение # 25
Рядовой
Группа: Пользователи
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
Да спасибо поменял местами лучше теперь:)

Тут уже по серьезному на классы перешел... smile
Класс танка потом от него наследуюсь к ботам и плейеру, но плейеру еще надо управление нормально присобачить а то дергается при движении из-за self.boxCam, точнее пересчетов по нему.
Вот короче второй заход. Так с повторением поверхности танком и не решил проблему. Поставил вокруг танка усики, как ты посоветовал, правый и левый усик диагональный проверяю и реагирую остальные просто висят пока. Так вот 36 ботов бегает по пересеченной местности и FPS 32-34, смотрю, что грузит это дело - а... опять коллизии... Что -то мне перестает это нравиться... Я понимаю что в принципе поверхность не сильно простая но так грузиться... может я что-то накодил лишнего? smile

Добавлено (30.07.2010, 17:02)
---------------------------------------------
Чувствую, некоторый код надо будет выводить наружу в pyd библиотеки... не думал, что будет так тормозить...

Прикрепления: exit2_001.zip(386Kb)


Сообщение отредактировал Lunar - Пятница, 30.07.2010, 16:31
 
ninthДата: Пятница, 30.07.2010, 17:05 | Сообщение # 26
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Поверхность хейтфилда по хорошему вообще не нужно на колллизии проверять - у геомиптеррайна есть встроенные методы на получение высоты и нормали без использования коллизий
 
LunarДата: Пятница, 30.07.2010, 18:27 | Сообщение # 27
Рядовой
Группа: Пользователи
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
Мг... щас покопаем, думаешь спасет?

Добавлено (30.07.2010, 18:27)
---------------------------------------------
Ну пощупал я...
Номрали брал так

Code
n=self.loc.getNormal(self.node.getX(),self.node.getY())

Z брал так
Code
Znew2 = self.loc.getElevation(self.node.getX(),self.node.getY())

где
loc это self.terrain=GeoMipTerrain("Terrain")
node - танк
Что получилось... Нормаль видимо какая то не такая как ожидается, танк все время двигается без поворотов по поверхности, на вершинах холмов танк тонет, в низинах плавает... даже если точнее как будто идет смещение карты визуальной и той по которой считаются нормали... Никаких модификаций с картой не делаю даже setPost. Да и скорость толком не увеличивается. увеличивается когда я полностью убираю коллизии с усиков вокруг танков ну и сами усики соответственно...
Вот такие дела...


Сообщение отредактировал Lunar - Пятница, 30.07.2010, 18:28
 
ninthДата: Пятница, 30.07.2010, 19:13 | Сообщение # 28
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Нужно брать не self.node.getX(),self.node.getY(), а рассчитывать на каком пикселе хейтмапа у тебя танк, если память не изменяет - позиция делённая на масштаб, делённая на размер блока. Т.е каждый пиксель хейтмапа преобразуется в полигон с определённой высотой и нормалью.

Что-то у меня ощущение, что ты боковыми усами тоже хейтмап щупаешь, хотя они, торетически никогда в него не упрутся - они предназначены для коллизий с другими танками и объектами. Назначь боковым усам и хейтмапу разные маски, а танкам и боковым усам - одинаковые.
Заметь, что расчёт производится не тогда, когда ты получаешь нормаль, а когда вызывается traverse()

 
LunarДата: Суббота, 31.07.2010, 00:38 | Сообщение # 29
Рядовой
Группа: Пользователи
Сообщений: 18
Награды: 0
Репутация: 0
Статус: Offline
Про traverse() не совсем понял... я вроде нигде не вызываю такое. Только один раз объявляю
Code
base.cTrav = CollisionTraverser()
и все..

Про боковые усы все правильно, я ими щупаю ландшафт если встречается крутая стенка то щуп до нее достает, и если левый ус касается то поворачиваю на право если правый на лево, это я их запустил шоб бегали хотел посмотреть производительнось рассчетов коллизий. Производительность удручает. Сейчас настроил на усы коллизии с другими танками, тормозит безбожно. Если все усы включить вообще тормоз... даже не знаю что и делать... Самая простая проверка отключить все усы (именно закомментировать их создание в коде) - летает... проверял через pstats львиная нагрузка на коллизии причем не с ландшафтом... беда.

Прикрепления: exit2_002.zip(393Kb)


Сообщение отредактировал Lunar - Суббота, 31.07.2010, 00:42
 
ninthДата: Суббота, 31.07.2010, 02:05 | Сообщение # 30
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Хм, к сожалению, я не могу проверить производительность на слабой машине. Однако, визуально вроде всё в порядке, может всё же стоит обратиться к ODE? Ведь его можно использовать не только как физический двиг, если беспокоит проблема синхронизации, но и просто для определения коллизий.

Другой вариант - проверять столкновения не в каждом кадре. base.cTrav это дефолтный траверсер, который автоматом вызывает traverse каждый кадр. Если же ты сделаешь свой, например world.myTraverser = CollisionTraverser() то сможешь вызывать метод world.myTraverser.traverse(), когда нужно и столько сколько нужно раз. Можно сделать несколько траверсеров, если например определять коллизии "в пол" нужно чаще чем остальные.

 
Форум Panda3D - по русски » Общий форум » Проекты » Демо игра "Танки" (типа физ движок)
Страница 2 из 3«123»
Поиск: