Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Помогите написать физический движок :) (27 стр)

Помогите написать физический движок :) (27 стр)

Страницы: 126 27 28 29 30 Следующая »
SuslikМодераторwww5 окт. 20189:42#390
nullptr
> Если ноль лежит на отрезке
то вершина одной геометрии касается ребра другой

в общем случае при разработке gjk лучше избегать случая, когда расстояние между геометриями меньше некоторого eps, потому что это вызывает численные нестабильности. лучше предположить, что между геометриями есть некоторый зазор, а если этот зазор оказывается на очередной итерации меньше eps, то стартовать sgjk или epa, прибавив к cso сферу радиусом в eps.

Правка: 5 окт. 2018 9:44

vindastПостоялецwww5 окт. 201811:44#391
Suslik
> прибавив к cso сферу радиусом в eps.
Это вообще как? ( в смысле куда?)

Я походу вообще ничего не понимаю.
Прямо так никто и не ответил, нужно ли искать на каждом шаге принадлежность нуля к симпексу или нет. Как и на вопрос, правильно ли я предполагаю на счет разбивки тетраэдра.

На счет избегания численной нестабильности. Я вот как думаю тогда сделать: после каждого шага возвращается вектор с новым направлением на начало координат. Если его длинна меньше какого-нибудь маленького значения, то буду считать что найдено пересечение.
Только вопрос остается с тем как достроить симплекс ( и нужно ли его вообще достраивать).

Я решил, что дальше буду делать epa.

Правка: 5 окт. 2018 11:45

vindastПостоялецwww5 окт. 201817:09#392
Вроде сделал. Вроде)))))))))
если внезапно найдуться желающие проверить код то могу скинуть.

Пока буду курить epa. Если у кого есть годная ссылка на эту тему, то пожалуйста в студию.

Есть еще вопрос, если альтернативы для построения контактных площадок методу, что предложил Suslik?

SuslikМодераторwww5 окт. 201817:11#393
vindast
> Есть еще вопрос, если альтернативы для построения контактных площадок методу,
> что предложил Suslik?
есть. bullet использует persistent contact manifold. только не спрашивай, как проверять ранее кешированные точки — никто не знает.
vindastПостоялецwww5 окт. 201817:24#394
Suslik, спрошу как найти самую глубокую точку контакта.

Я могу предположить, что берем две точки от каждого конвекса вдоль и против оси контакта, а что потом?

Правка: 5 окт. 2018 17:30

werasaimonПостоялецwww5 окт. 201818:42#395
vindast
> Есть еще вопрос, если альтернативы для построения контактных площадок методу,
> что предложил Suslik?
>
> Suslik Модератор www «»
Ещё есть петурбирация+clipping  как в bullet  , ну это работает точно так плохо как и AxisRotation+clipping , а дело в том что не петурбирация не AxisRotation не дадут правильные контактные площадки для дольнейшого clippingа в 100% случаев.  Ибо за чистую кофициент esp для разных геометрий он разный, который надо подбирать с помощью бубна.
Наверное единственный способ правильно пристроить контрактные площадки для дольнейшого  clippinga это делать как в движке Newton , то бишь за ранее проицелизировать ребра как своеобразный граф, и потом контактные площадки строить как граф по поверхности отнсительно нормали колизии. Кароче говоря просто перебрать нужные ребра и построить из них строить конаткыне площадки . Где в графе каждое ребро имеет указатель  на следующие ребро.
Но проблема в том что прийдётся хранить дополнительную типа (Edge_N, Face_N) , а не просто одну функцию Sp(Dir)!

Suslik
> есть. bullet использует persistent contact manifold.
Он плохо работатет , особено с concave_mesh 

Правка: 5 окт. 2018 18:45

vindastПостоялецwww6 окт. 20180:28#396
Пример работы, вдруг интересно будет. Моя реализация всегда возвращает тетраэдр в случае пересечения.

MikeNewПостоялецwww6 окт. 201811:37#397
Сейчас делаю чтобы шарик катался по карте высот - у меня голова взрывается. Приходится заново вспоминать и геометрию и линейную алгебру.
vindastПостоялецwww6 окт. 201814:21#398
MikeNew,рейкастишь, радуешься жизни ) Но не всегда.

Правка: 6 окт. 2018 14:21

vindastПостоялецwww7 окт. 201819:04#399
Есть быстрый и эффективный способ проверки принадлежности точки треугольнику?
(Я только способ с формулой герона представляю - разбивка на три треугольника и проверка равенства суммы площадей площади начального)
Если что, точка заведомо в плоскости треугольника.

Правка: 7 окт. 2018 19:06

tegaussПостоялецwww7 окт. 201821:08#400
Можно так: для каждого отрезка, образующего сторону треугольника, проверить, лежит ли исследуемая точка и оставшаяся вершина треугольника по одну сторону от этого отрезка.

Правка: 7 окт. 2018 21:09

MrShoorУчастникwww8 окт. 20181:41#401
vindast
> Есть быстрый и эффективный способ проверки принадлежности точки треугольнику?
3 cross product с проверкой знака?
MrShoorУчастникwww8 окт. 20181:50#402
Типа как-то так:
Для 2д случая:
float cross2d(vec2 a, vec2 b) {
  return a.x*b.y - a.y*b.x;
}

bool PointInTriangle(vec2 p, vec2 pt1, vec2 pt2, vec2 pt3) {
  float s = cross2d(p, pt2 - pt1);
  return (s * cross2d(p, pt3 - pt2) > 0) && (s * cross2d(p, pt1 - pt3) > 0);
}

Для 3д случая:

bool PointInTriangle(vec3 p, vec3 pt1, vec3 pt2, vec3 pt3) {
  vec3 p1c = cross(p, pt2 - pt1);
  vec3 p2c = cross(p, pt3 - pt2);
  vec3 p3c = cross(p, pt1 - pt3);
  return ( dot(p1c, p2c) > 0 ) && ( dot(p2c, p3c) > 0 );
}

vindastПостоялецwww8 окт. 20182:37#403
MrShoor, а дешевле ли это чем три раза перерасчет по формуле герона?
MrShoor сюда зашел)
Метод выглядит довольно красиво.

Возникла у меня у меня проблема с EPA.
Собственно с ep. На стадии добавления новой вершины в polytope.
делаю как: нашел минимальную ось, если нет экстермальной точки в этом направлении дальше чем эта точка (с некоторой погрешностью) то поиск завершен. А если есть, возникает проблема что polytopу надо расширить по новой экстремальной точки.

По тутору, что я нашел https://youtu.be/6rgiPrzqt9w?t=1458 нужно выкинуть все треугольники у которых нормаль в том же направлении, что и новый экстремум (dot(v, normal) > 0.0f). Вопрос в том как понять reverse edge или нет. Я нашел решение только для двумерного случая. Вопрос для трехмерного плохо гуглится. Помогите )
Я пытался просто проверить куда смотрит нормаль нового треугольника в сторону от origin или нет. Но это не всегда работает. Иногда появляются два треугольника которые смотрят друг на друга.

Результат, который есть сейчас похож на правду в некоторых случаях, но все равно не правильный в общем случае.

Правка: 8 окт. 2018 2:40

MikeNewПостоялецwww8 окт. 20185:49#404
vindast
> Есть быстрый и эффективный способ проверки принадлежности точки треугольнику?
Смешанным произведением векторов как вариант.
Страницы: 126 27 28 29 30 Следующая »

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

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