[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Форум Panda3D - по русски » Panda3D » Общие вопросы » Collision Detection (Разбор по косточкам.)
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:

Прикрепления: CollisionDetect.rar(124Kb)
 
3dmaxДата: Четверг, 14.05.2009, 12:45 | Сообщение # 2
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
В Roaming Ralph я загружал свои модели, с небольшими правками. И они работали.
А Pusher имеет ряд недостатков, но по этому поводу ninth больше тебя просветит happy
 
ninthДата: Четверг, 14.05.2009, 15:50 | Сообщение # 3
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 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
Распоковать в корень С:

Прикрепления: TryMesh_vs_TryM.rar(172Kb)


Сообщение отредактировал 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
Группа: Администраторы
Сообщений: 1555
Награды: 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:

Прикрепления: pusher.rar(4Kb)
 
3dmaxДата: Четверг, 21.05.2009, 08:45 | Сообщение # 9
Генерал-майор
Группа: Проверенные
Сообщений: 334
Награды: 0
Репутация: 1
Статус: Offline
Quote (g_p3d)
CollisionHandlerPusher — эта штука отталкивает, не даёт входить одному объекту в другой.
Так какой-же это недостаток все правильно работает.
еще раз говорю, эти недостатки сразу не видно, пушер прежде всего работает только с нормалями обьектов. Тоесть если полигоны инвертировать то получиться совсем не то. (это в тех случаях когда тебе нужет 1 полигон в качастве стенки)
 
ninthДата: Четверг, 21.05.2009, 10:08 | Сообщение # 10
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 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
Распоковать в корень С:

Прикрепления: munual_v1_cd.rar(58Kb)


Сообщение отредактировал Grisha___ - Пятница, 11.09.2009, 09:25
 
ninthДата: Среда, 16.09.2009, 20:54 | Сообщение # 12
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 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:

Прикрепления: 4015947.rar(1Kb)


Сообщение отредактировал Grisha___ - Четверг, 17.09.2009, 16:14
 
Dimon3DДата: Четверг, 17.09.2009, 19:30 | Сообщение # 14
Полковник
Группа: Проверенные
Сообщений: 200
Награды: 1
Репутация: 4
Статус: Offline
Походу без луча колидящего вертикально вниз не обойтись sad
 
ninthДата: Четверг, 17.09.2009, 22:06 | Сообщение # 15
Admin
Группа: Администраторы
Сообщений: 1555
Награды: 5
Репутация: 46
Статус: Offline
Всё верно.
Да, с пушером похоже внутренний глюк. Он не работает строго при 0 градусов, достаточно повернуть его хотя бы на пол градуса и всё заработает. У меня сильное подозрение что тут что-то с трансформациями векторов, но внутрь не лазил, как-то не до того было.
 
Форум Panda3D - по русски » Panda3D » Общие вопросы » Collision Detection (Разбор по косточкам.)
Страница 1 из 212»
Поиск: