Пример FPS
|
|
ninth | Дата: Четверг, 12.02.2009, 15:29 | Сообщение # 1 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Пример управления FPS + коллизии Взято с родного форума панды, поэтому комменты на английском, если что-то непонятно - спрашивайте
|
|
| |
Dimon3D | Дата: Четверг, 12.02.2009, 16:41 | Сообщение # 2 |
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
| А можно поподробнее объяснить, что происходит в подпрограмме createCollisions этого примера. Что за BitMask32... Вроде идет описание сферы, а потом опять какие-то лучи(ray)?
|
|
| |
ninth | Дата: Четверг, 12.02.2009, 22:55 | Сообщение # 3 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Да, основной коллидер - это сфера. Луч в этом примере используется для прыжка - с помошью него определяется расстояние до пола. BitMask - используется для указания какие поверхности с какими коллидятся.
|
|
| |
Dimon3D | Дата: Пятница, 13.02.2009, 07:06 | Сообщение # 4 |
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
| if z > highestZ and entry.getIntoNode().getName() == "Cube": Это, что-бы определить объект столкновения, нужно слазить в файл модели (в данном случае 'Level'), и найти там нужную группу вертексов ("Cube")? Да уж...Добавлено (13.02.2009, 07:06) --------------------------------------------- Почему при увеличении радиуса CollisionSphere, ее начинает тянуть в сторону? Тоже самое происходит при изменении масштаба self.node
|
|
| |
ninth | Дата: Пятница, 13.02.2009, 08:16 | Сообщение # 5 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| 1. Да. Можешь считать это плюшкой панды. ведь благодаря этому можно нарулить каркас логики прямо в трёхмерном редакторе, присвоив объектам определённые имена и проверяя это потом из программы. 2. Ползёт в сторону наклона?
|
|
| |
ninth | Дата: Пятница, 13.02.2009, 08:44 | Сообщение # 6 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Получается следующая фигня: сфера большая, поэтому приподнимает игрока над полом выше, чем рассчитывал автор при проверке расстояния до пола - программа пытается смещать игрока вниз, считая, что он сейчас в прыжке и ему надо опуститься на пол, сфера этого не даёт делать и соскальзывает по полу в сторону даже минимального наклона.
|
|
| |
ninth | Дата: Пятница, 13.02.2009, 09:06 | Сообщение # 7 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Долбится только там, где ниши? Это построение уровня такое - где-то за что-то цепляется. В стандартном варианте, если подпрыгнуть около них и нажать вперёд - та же фигня ----------------------------------- А вообще не рекомендуется использовать для коллизий ту же геометрию, что и для визуализации - разработчики советуют делать отдельную упрощённую геометрию для этих целей, т.к. использование относительно высокополигонального уровня для детекции столкновения вызовет лишнюю нагрузку
|
|
| |
ninth | Дата: Пятница, 13.02.2009, 09:18 | Сообщение # 8 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Объекты с одинаковой маской коллидятся, с разной - игнорят столкновения друг с другом. Вообще, в данном примере эти строки необязательны - видимо выдернуты из какого-то другого примера
|
|
| |
ninth | Дата: Пятница, 13.02.2009, 10:40 | Сообщение # 9 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| можно оставить только cn.setIntoCollideMask(BitMask32.allOff()) это сообщается о том, что в луч коллидится нельзя - т.е. в отличае от остальных коллижн объектов луч может сам проверять коллизию, но в него врезаться нельзя, а т.к. маска не стоит коллизия пытается его со сферой столкнуть
|
|
| |
Dimon3D | Дата: Пятница, 13.02.2009, 11:48 | Сообщение # 10 |
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
| То есть происходит только проверка на сам факт столкновения, а реакции на это столкновеие нет. Так ?
|
|
| |
ninth | Дата: Пятница, 13.02.2009, 12:00 | Сообщение # 11 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| Да. Оно пытается проверить столкновение, потом соображает, что это луч и с ним столкнуться нельзя, после чего выдаёт соответствующее ругательство. Так что ставь только cn.setIntoCollideMask(BitMask32.allOff()) что указывает что не надо проходить проверку на коллизию в луч. Это не критично, но будет являться хорошим тоном, а если у тебя множество лучей, то ещё и ускорит просчёт
|
|
| |
Dimon3D | Дата: Пятница, 13.02.2009, 15:54 | Сообщение # 12 |
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
| При нажатии на кнопку выполняется: def getE(): for i in range(queue.getNumEntries()): entry = queue.getEntry(i) textObject.setText(str(entry)) Что означает эта информация?
|
|
| |
ninth | Дата: Пятница, 13.02.2009, 16:00 | Сообщение # 13 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| А где это ты взял - глянуть бы на весь код? Но предполагаю цикл для i в диапазоне очереди коллизий получаем коллизию номер i выводим о ней инфу Или тебе нужно знать что за инфа выводится?
|
|
| |
Dimon3D | Дата: Пятница, 13.02.2009, 16:06 | Сообщение # 14 |
Полковник
Группа: Проверенные
Сообщений: 202
Награды: 1
Репутация: 4
Статус: Offline
| да. Что за инфа
|
|
| |
ninth | Дата: Пятница, 13.02.2009, 16:14 | Сообщение # 15 |
Admin
Группа: Администраторы
Сообщений: 1582
Награды: 5
Репутация: 46
Статус: Offline
| коллидящиеся обекты точка контакта в координатах тела "in" вектор нормали к поверхности в точке контакта глубина проникновения тел
|
|
| |