| Collision Detection | 
|  | 
| 
| g_p3d | Дата: Среда, 13.05.2009, 16:58 | Сообщение # 1 |  |  Рядовой Группа: Пользователи Сообщений: 17 Награды: 0 Репутация: 1 Статус: Offline | Эта тема посвещена созданию колизий. Когда я начал изучать панду то оболдел от того насколько сложные в ней колизи.
 Семплы которые идут в комплекте с пандой такие как Roaming Ralph или Ball-in-Maze просто не пригодны
 для самостоятельного освоения потому-что когда в них грузишь свои модели они просто перестают работать
 похоже эти модели в себе уже содержат какие-то настройки установленные не в коде.
  Поэтому решил развить эту тему и создать несколько примеров с разными хендлерами. Точней разобрать Collision Detection что называется по косточкам.
  Так что всех желающих поделится опытом приглошаю присоединиться к разговору о коллизиях в panda3d. Думаю нужно начать с CollisionHandlerPusher().
  В этой теме форума мне-бы хотелось решить вот эту задачу. Есть два объекта ландшафт.egg и модель.egg оба произвольной формы.
 Нужно зделать так что-бы они сталкивались.
 И что-бы они сталкивались не боксам или сферой а именно своей не ровной формой.
  1-й Вопрос какой солид для этого использовать и как его использовать ? 2-й Вопрос как использовать битовую маску и нужна ли она вобще для решения этой задачи ?
  Вот набросал код, а он неработает и что делать дальше ещё не понял думаю нужно как-то назначить объектам солид и битовую маску(возможно ошибаюсь).
  Здесь архив с кодом. Для запуска разпакуйте его в корень C:
 |  |  |  |  | 
| 
| 3dmax | Дата: Четверг, 14.05.2009, 12:45 | Сообщение # 2 |  |  Генерал-майор Группа: Проверенные Сообщений: 334 Награды: 0 Репутация: 1 Статус: Offline | В Roaming Ralph я загружал свои модели, с небольшими правками. И они работали. А Pusher имеет ряд недостатков, но по этому поводу ninth больше тебя просветит
   |  |  |  |  | 
| 
| ninth | Дата: Четверг, 14.05.2009, 15:50 | Сообщение # 3 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | http://panda3d.org.ru/forum/9-45-2 Предпоследний урок по коллизиям.
 Солиды могут быть - прямая, луч, сфера, отрезок, капсула (туба), инвертированная сфера, полигон
 Если позарез нужны коллизии freeform vs freeform - можно попробовать использовать ODE.
 Действительно, коллизии можно задавать непосредственно в файле модели, тогда не обязательно использовать маску. Если коллизии в файле не заданы, то придётся назначать маску вручную. Однако, в любом случае, маска - штука полезная для оптимизации.
 |  |  |  |  | 
| 
| g_p3d | Дата: Пятница, 15.05.2009, 13:32 | Сообщение # 4 |  |  Рядовой Группа: Пользователи Сообщений: 17 Награды: 0 Репутация: 1 Статус: Offline | 1-е 3dmax Я в Ralph загружал свои модели с небольшими правками и они работали.
 Верю но как ты догодался о том что и где нужно править а ?
 Наверняка с помощью этого форума, а не сомостоятельно.
 А моя цель создать несколько примеров для самостоятельного освоения колизий в панде.
  Вот смотри набор хендлеров. CollisionHandlerQueue — это очередь столкновений.
 CollisionHandlerEvent — эта штука не записывает столкновения, а генерирует на их основе события.
 CollisionHandlerPusher — эта штука отталкивает, не даёт входить одному объекту в другой.
 PhysicsCollisionHandler — это тот-же Pusher с некоторыми элементами физики.
 CollisionHandlerFloor — симуляция пола + опять же элементы физики.
  Воообще я не тупой :-) Но как их реализовать (как написать код) я непонимаю. Хотя уже раз 100 перечитал мануал. Просто понимаешь мануал бедненький на сэмплы.
 А в токой ситуации помочь может только сообщество единомышленников.
  2-е 3dmax А Pusher имеет ряд недостатков.
 А можно по подробне какие недостатки имеет Pusher.
 В мануале об этом ничего не сказано.
  1-е ninth Спосибо за мотериал буду его усваивать.
  2-е ninth Солиды могут быть - прямая, луч, сфера, отрезок, капсула (туба), инвертированная сфера, полигон.
 Это всё мне известно это есть в мануале.
 А вот кода с примерами использования этих солидов и хендлеров очень мало, а о физике я вобще пока промолчу.
  3-е ninth Если позарез нужны коллизии freeform vs freeform - можно попробовать использовать ODE.
 Я пробовал оде с freeform vs freeform глянь что получилось.
 Либо я что-то не так зделал либо слухи об TryMesh vs TryMesh в оде правда.
 А судя по тому что я читал в инете об оде, с TryMesh дела обстоят очень плохо.
 Говорят TryMesh vs TryMesh в оде неработает вообще и что это главный недостаток оде.
 Да и в мануале есть предупреждение толи о не точности толи о ненадежности TryMesh-а.
  В этом коде я специально установил массу объекта такой большой. Если поставить массу в 10кг или меньше то модель вобще летать будет точней отскакивать высоко высоко.
 Есть какие нибудь мысли от чего так модель колбасит.
  Да ещё в архиве есть папка error там пронумерованные ошибки в порядке вылетания на экран. Они не всегда вылетают очень редко но выскакивают.
 От чего х.з. возможно от большой массы обьекта но на маленькой массе тоже выскакивают иногда.
  Вот архивчик с ODE TryMesh vs TryMesh Распоковать в корень С:
 
 
 Сообщение отредактировал g_p3d - Пятница, 15.05.2009, 19:18 |  |  |  |  | 
| 
| g_p3d | Дата: Пятница, 15.05.2009, 13:35 | Сообщение # 5 |  |  Рядовой Группа: Пользователи Сообщений: 17 Награды: 0 Репутация: 1 Статус: Offline | * 
 
 Сообщение отредактировал g_p3d - Пятница, 15.05.2009, 13:41 |  |  |  |  | 
| 
| ninth | Дата: Пятница, 15.05.2009, 14:12 | Сообщение # 6 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | Quote (g_p3d) Вот архивчик с ODE TryMesh vs TryMesh  Перезалей файлик.   Оде действительно не всегда корректно работает с фриформами, но пока что я не видел ни одной игры, которая бы использовала для физики и проверки коллизий полноценную геометрию. |  |  |  |  | 
| 
| 3dmax | Дата: Пятница, 15.05.2009, 16:48 | Сообщение # 7 |  |  Генерал-майор Группа: Проверенные Сообщений: 334 Награды: 0 Репутация: 1 Статус: Offline | g_p3d в Pusher-е я находил 2 больших недостатка: 1. Обьекты не проходят друг свозь друга, НО если нормаль полигона одного обьекта стоит наоборот , тогда проскакуешь. Я когда колизии для забора делал, то с одной стороны не проходил а с другой просто "пролетал" сквозь забор.
 2. Pusher начинает "колбисить"(скакать туда сюда) если допустим ты подошел под окно в доме, из-за близости окна почему то колбасит. И вообще частенько такое бывало.
 По этому мне ninth, (спасибо ему огромное написал проверку колизий сферы вручную)
  Правильно ninth, сказал что практически нет ни одной игры, которая бы использовала для физики и проверки коллизий полноценную геометрию. Поэтому лучше использовать какие то примитивы, это проще и быстрее для просчета физики.
 |  |  |  |  | 
| 
| g_p3d | Дата: Вторник, 19.05.2009, 16:40 | Сообщение # 8 |  |  Рядовой Группа: Пользователи Сообщений: 17 Награды: 0 Репутация: 1 Статус: Offline | ninth 1-е фалик я перезолил и сам скачал(проверил) сейчас всё работает нормально.
 2-е Да речь не отом чтобы использовать полноценную геометрию, а о том возможно ли это в панде вообще.
 Потому что если freeform есть в движке то с помощью freeform vs freeform можно создать любую колизию.
 Если в движке есть freeform vs freeform это означает что система колизий очень гибкая,
 а все эти сферы, боксы, целиндры, и т.д это второстепенные вещи это оптимизаторы ведь даже их
 можно создать с помощью freeform. Или вот пример когда потребутся создать какой нибудь сложный уголок или
 поверхность для столкновения с примитивами возится замучаетесь, а freeform в 3Д редакторе пяток вершин в ручную
 подтянул куда надо и грузи в движок готовый солид. Так что я не согласен с тем что с примитивами работать проще.
 Хотя я согласен с тем что для оптимизации примитивы вещь незаменимая и общёт колизий
 будет быстрей, стабильней, надёжней но работать проще с freeform-ами.
 Каждый хороший движок потдерживает freeform vs freeform даже тот же ньютон (физ двиг) это потдерживает
 я раньше с ним работал. freeform vs freeform штука нужная и удобная особенно в момент отладки.
  3dmax Обьекты не проходят друг свозь друга.
 Но pusher ведь для этого и создан
 CollisionHandlerPusher — эта штука отталкивает, не даёт входить одному объекту в другой.
 Так какой-же это недостаток все правильно работает.
 А я наоборот немогу сталкнуть объекты все время насквозь проходят несталкиваются.
  Вопрос нужноли назначать солид объекту с которым я хочу столкнуть солид сферу или достаточно указать ему маску. Еще вопрос почему в этом коде pusher не сталкивает объекты непойму (все правельно ведь написано).
  Здесь архив с кодом. Для запуска разпакуйте его в корень C:
 |  |  |  |  | 
| 
| 3dmax | Дата: Четверг, 21.05.2009, 08:45 | Сообщение # 9 |  |  Генерал-майор Группа: Проверенные Сообщений: 334 Награды: 0 Репутация: 1 Статус: Offline | еще раз говорю, эти недостатки сразу не видно, пушер прежде всего работает только с нормалями обьектов. Тоесть если полигоны инвертировать то получиться совсем не то. (это в тех случаях когда тебе нужет 1 полигон в качастве стенки)Quote (g_p3d) CollisionHandlerPusher — эта штука отталкивает, не даёт входить одному объекту в другой. Так какой-же это недостаток все правильно работает.
 |  |  |  |  | 
| 
| ninth | Дата: Четверг, 21.05.2009, 10:08 | Сообщение # 10 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | Глянул - забавный глюк пушера - работает с вертикальными поверхностями, а вот с горизонтальными, несмотря на то, что детектит их, - не отталкивается |  |  |  |  | 
| 
| Grisha___ | Дата: Пятница, 11.09.2009, 09:20 | Сообщение # 11 |  |  Рядовой Группа: Пользователи Сообщений: 7 Награды: 0 Репутация: 1 Статус: Offline | Это g_p3d Два месеца на форум попасть немог что с сайтом происходит логи и пароль не принимает
 меня что забанили тогда предупредили бы за что непонимаю.
 Я по новой зарегестрировался теперь меня звать не g_p3d а Grisha___.
 Ну да ладно теперь вроде всё в порядке продолжаем тему.
  Вобщем коллизии я освоил проктически от А до Б и у меня возникли некоторые вопросы.   Вопрос 1-й. Столкновения не работают пока в фаил не добавиш вот эту строку <Collide> { Polyset keep descend } что эта строка означает?
 -------------------------------------------------------
 После импортирования из 3DsMax нужно добавить в egg фаил строку перед вертексным пулом.
  <Collide> { Polyset keep descend } Без этой строки столкновения не работают.
  Примерно так вырезка из файла. <CoordinateSystem> { Z-Up }
  <Group> Plane01 { __<Collide> { Polyset keep descend }
 __<VertexPool> Plane01.verts {
 ____<Vertex> 0 {
 ______5 -4.8 0
 ______<Normal> { 0 0 1 }
 ____}
 ---------------------------------------
  Вопрос 2-й. Почему блендеровскии модели колидятса без этой строки, a 3DsMax-овые нет может это в экспортере косяк.
  Вопрос 3-й про Pusher. Вот есть у нас файл “Pusher Sphere vs plane.egg” в нём есть два объекта солид сфера и plane.egg. Сфера находится в координатах setPos(0,0,5), а план находится в координатах setPos(0,0,0) и план повернут на угол
 setHpr(0,0,0). Сфера падает на план сверху и не сталкивается вопрос почему, а если план повернуть setHpr-ам на любой
 уго хотябы на 0.0001 то сфера сталкивается вопрос почему это происходит.
 Я нашел один способ это исправить не пользоватса Pusher-ом вообще.
 HendlerPhysics лишён этого недостатка поэтому рекомендуется использовать Physics, а не Pusher.
  Когда я начинал тему моей целью было создать несколько примеров для самостоятельного освоения колизий в панде. Вот глянте чего получилось.
  Зацените мануал. Очень интересно будет узнать ваше мнение.
 Не стесняйтесь скажите чего бы вам хотелось видеть в мануале ещё, чего нехватает и т.д.
 Присоединяйтесь к разработки мануала по колизиям панды ваша помощ будет очень полезной.
  Вот архивчик с manual CollisionDetection Распоковать в корень С:
 
 
 Сообщение отредактировал Grisha___ - Пятница, 11.09.2009, 09:25 |  |  |  |  | 
| 
| ninth | Дата: Среда, 16.09.2009, 20:54 | Сообщение # 12 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | RTFM http://www.panda3d.org/wiki/index.php/Egg_Syntax#Collide |  |  |  |  | 
| 
| Grisha___ | Дата: Четверг, 17.09.2009, 16:13 | Сообщение # 13 |  |  Рядовой Группа: Пользователи Сообщений: 7 Награды: 0 Репутация: 1 Статус: Offline | 1-е ninth спосибо огроменное я всё понял про <Collide> { Polyset keep descend }. <Collide> это говорит о том что эта геометрия будет использоваться для коллизий.
 {
 Polyset это говорит о том что эта геометрия очень сложная состоящая из нескольких polygons.
 keep это говорит о том что из этой геометрии будет созданны две модели одна будет невидимой для столкновений, а вторая будет видимая для рендера.
 descend это говорит о том что все его потомки(<Group>) также будут проверенны на столкновения если они есть конечно.
 }
 Я правильно понимаю.
  2-е. Так какие соображения по поводу Pusher-а почему не сталкивается в чем косяк то ? А если повернуть плоскость setHpr(0,0,45) сталкивается без проблем.
 Я ведь всё написал правильно.
 Помоему это внутренний(ошибка пушера а не моя) глюк Pusher-а.
 Кто ещё с этим сталкивался поделитесь опытом как это исправить.
  Вот архивчик с косяком пушера. Распоковать в корень C:
 
 
 Сообщение отредактировал Grisha___ - Четверг, 17.09.2009, 16:14 |  |  |  |  | 
| 
| Dimon3D | Дата: Четверг, 17.09.2009, 19:30 | Сообщение # 14 |  | Полковник Группа: Проверенные Сообщений: 202 Награды: 1 Репутация: 4 Статус: Offline | Походу без луча колидящего вертикально вниз не обойтись   |  |  |  |  | 
| 
| ninth | Дата: Четверг, 17.09.2009, 22:06 | Сообщение # 15 |  |  Admin Группа: Администраторы Сообщений: 1582 Награды: 5 Репутация: 46 Статус: Offline | Всё верно. Да, с пушером похоже внутренний глюк. Он не работает строго при 0 градусов, достаточно повернуть его хотя бы на пол градуса и всё заработает. У меня сильное подозрение что тут что-то с трансформациями векторов, но внутрь не лазил, как-то не до того было.
 |  |  |  |  |