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
| Quote (g_p3d) CollisionHandlerPusher — эта штука отталкивает, не даёт входить одному объекту в другой. Так какой-же это недостаток все правильно работает. еще раз говорю, эти недостатки сразу не видно, пушер прежде всего работает только с нормалями обьектов. Тоесть если полигоны инвертировать то получиться совсем не то. (это в тех случаях когда тебе нужет 1 полигон в качастве стенки)
|
|
| |
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 градусов, достаточно повернуть его хотя бы на пол градуса и всё заработает. У меня сильное подозрение что тут что-то с трансформациями векторов, но внутрь не лазил, как-то не до того было.
|
|
| |