Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / sat и круги

sat и круги

Поделиться

Страницы: 1 2 Следующая

DimichПостоялецwww10 авг. 201715:03#0
Сделал collision detection через sat, который вызывает одну из двух функций testBoxBox и testBoxCircle, всё вроде работает, но глючит, решается вызовом 3 раза за кадр, вроде хорошо, но только между боксами. В чём глюк, Когда сталкиваются 3 объекта, если 2 круга и бокс, то всё ломается к чертям, объекты проходят насквозь. Круг всегда выталкивает другой круг в одну сторону, и бокс не может вытолкнуть его правильно.
Странно объяснил, позже кину html версию проблемы, если непонятно, о чём я говорю
MisanthropeПостоялецwww10 авг. 201722:52#1
Dimich
> Когда сталкиваются 3 объекта
может парами проверять надо?
DimichПостоялецwww11 авг. 20176:23#2
Misanthrope
> может парами проверять надо?
Это понятно, я про частный случай, когда проблема возникает.
SuslikМодераторwww11 авг. 20177:41#3
ошибка в 42 строчке. какого ещё ответа ты ждёшь без видео и/или кода? при отладке физики самое главное — это должное время уделять отладочной визуализации. уж точки контакта с нормалями рендерить надо всегда.
DimichПостоялецwww11 авг. 20177:50#4
Suslik
> уж точки контакта с нормалями рендерить надо всегда.
У sat есть точки контакта? Проблему я вроде описал, она в нормалях.
SuslikМодераторwww11 авг. 20178:11#5
Dimich
ну так от одной оси толку для физики мало, нужно ещё после неё точки контакта искать. хотя первым делом нужно, разумеется, хотя бы ось отладить, её всё равно нужно рендерить и внимательно смотреть, правильно ли она ищется. полезно также бывает сделать режим замедленного времени, паузу и покадровый ход времени, чтобы была возможно внимательно рассмотреть баги.
DimichПостоялецwww11 авг. 20178:40#6
html5
Вот. В архиве несколько js файлов, для запуска web-сервер не нужен, круг проходит между другим кругом и боксом. Управление: стрелки/wasd - двигать активную фигуру, r - поворот, 1234 - выбор активной фигуры.
SuslikМодераторwww11 авг. 20178:46#7
что из этого тестировать-то? ну видно, что что-то движется, видно, что что-то выталкивается, но я не знаю, что именно тебя не устраивает. сразу бы записал видео и проблем бы не было.

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

DimichПостоялецwww11 авг. 20178:51#8
Suslik
С боксами итеративный подход работает, с кругами нет, посоветуй.
SuslikМодераторwww11 авг. 20179:09#9
Dimich
разницы между кругами и боксами нет. например, если из двух боксов сделать двумерную "воронку" с маленьким углом раствора, то в неё при желании можно вприхнуть третий бокс, который по размером может быть больше, чем узкий конец получившегося прохода:
penetration | sat и круги

это — особенность метода разрешения контактов, а не их поиска. к алгоритму обнаружения столкновений никак не относится.

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

Правка: 11 авг. 2017 9:14

DimichПостоялецwww11 авг. 20179:10#10
Suslik
> особенность метода разрешения контактов, а не их поиска. к алгоритму
> обнаружения столкновений никак не относится.
А sat не подразумевает поиск mtv? Я думал, что оно вместе идёт.
SuslikМодераторwww11 авг. 20179:13#11
Dimich
> А sat не подразумевает поиск mtv? Я думал, что оно вместе идёт.
если речь идёт об mtd, то sat его ищет только для пары тел. если взаимодействующих тел больше двух, то ситуация существенно усложняется и сумма mtd вовсе не обязана разрешать все проникновения.

расталкивая тела A и B, ты можешь углубить контакт B и C. расталкивая B и C, ты можешь углубить контакт A и B. цикл повторяется бесконечно, хотя обычно спустя много итераций проникновения постепенно уменьшаются.

Правка: 11 авг. 2017 9:15

DimichПостоялецwww11 авг. 20179:15#12
Suslik
Это понятно, а как найти результирующий вектор между тремя телами?
SuslikМодераторwww11 авг. 20179:18#13
Dimich
в случае, если два из трёх взаимодействующих тел статические, то полученную LCP можно решить аналитически. решение получится в духе (normalize(d1) + normalize(d2)) / (dot(d1, d2)). но это — частный случай, который в общем-то, ничем ситуацию не спасёт, если взаимодействуют динамические тела или есть вращение.
DimichПостоялецwww11 авг. 20179:24#14
Безымянный | sat и круги
Вот такое как найти?

Страницы: 1 2 Следующая

/ Форум / Программирование игр / Физика

2001—2017 © GameDev.ru — Разработка игр