Войти
ПрограммированиеФорумФизика

MPR-тест и подсчет глубины проникновения по нужному вектору (2 стр)

Страницы: 1 2
#15
12:24, 22 мая 2020

MikeNew
у тебя даже размерность не совпадает. откатываться по времени (измеряеся в секундах) нужно на расстояние проникновения (метры), делённое на скорость проникновения (метры/секунду). скорость проникновения — это скалярное произведение вектора скорости на нормаль проникновения (безразмерная).


#16
6:03, 27 мая 2020

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

Изображение

Просто делают проверку (чтобы скорость проникновения не была равной нулю и чтобы время отката не было неправильным) и в случае провала проверки переходят к методу бинарного деления?

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

#17
6:12, 27 мая 2020

MikeNew
> Интересует, что делают в следующих случаях:
продолжают ту же самую итерацию до тех пор, пока не найдётся точка пересечения. это называется метод ньютона. только нужно ограничивать "откат" по времени, чтобы не выходить за пределы интервала он начала текущего кадра до его конца.

#18
6:25, 27 мая 2020

Suslik
> продолжают ту же самую итерацию до тех пор
То есть, к примеру, если во второй итерации нет столкновения (а значит нету и глубины с вектором проникновения) мы используем глубину проникновения и вектор из первой итерации?

#19
6:29, 27 мая 2020

Suslik
> только нужно ограничивать "откат" по времени
В первом случае как это поможет?
Там деление на ноль, соответственно "откат" после ограничения получается максимальным и в итоге меш вообще не сдвинется с места после первой итерации.

Update: Да и во втором случае так же может получится, если продолжать итерацию дальше.

#20
6:39, 27 мая 2020

MikeNew
> В первом случае как это поможет?
Скорее всего, классического способа из разряда "навыки правильной работы с плавающим питухом" хватит.
Считаешь, что dot у тебя положительный и пишешь неравенство на границу интервала.
Убираешь знаменатель у этого неравенства путем умножения на этот dot.
Получившееся неравенство оказывается работающим и при нулевых и при отрицательных dot.

#21
6:49, 27 мая 2020

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

#22
7:12, 27 мая 2020

Suslik
> нет, ты используешь расстояние между объектами как отрицательную глубину
> проникновения
Проблема, MPR-тест из libccd, который я использую, не возвращает такого, и вообще я читал что минимальное расстояние между объектами возвращает только GJK.
Или я могу получить его сам с помощью support-функций?

#23
7:16, 27 мая 2020

MikeNew
> Проблема, MPR-тест из libccd, который я использую, не возвращает такого
тогда тебе не остаётся ничего, кроме как вперёд всегда идти бинарным делением, а назад — итерацией ньютона.

#24
7:43, 27 мая 2020

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

#25
7:56, 27 мая 2020

}:+()___ [Smile]
> Считаешь, что dot у тебя положительный
Типа сделать его максимально приближенным к нулю, например 0.000001?
> и пишешь неравенство на границу интервала.
> Убираешь знаменатель у этого неравенства путем умножения на этот dot.
> Получившееся неравенство оказывается работающим и при нулевых и при
> отрицательных dot.
Извини, можно пример в виде формулы (ну если не лень)? А то до меня что-то не доходит в таком виде.

#26
8:18, 27 мая 2020

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

#27
8:22, 27 мая 2020

MikeNew
> Извини, можно пример в виде формулы (ну если не лень)? А то до меня что-то не доходит в таком виде.
Ну вот у тебя есть вектор сдвига за шаг \(\vec v\) и вектор проникновения \(\vec d\).
Момент удара (в долях шага) считается как

\(\displaystyle\tau=\frac{d^2}{\vec v\cdot\vec d}.\)

Проблема в том, что \(\vec v\cdot\vec d\) может быть нулевым или, вообще, отрицательным.
Однако, мы знаем, что \(\tau<1\); умножаем на знаменатель и получаем \(d^2<\vec v\cdot\vec d\).
Полученное неравенство уже работает для любых скалярных произведений:

\(\displaystyle\tau=\left\{\begin{array}{ll}\frac{d^2}{\vec v\cdot\vec d},&d^2<\vec v\cdot\vec d,\\1,&d^2\geq\vec v\cdot\vec d.\end{array}\right.\)

В случае отрицательной глубины проникновения там немного сложнее, но суть та же.

Страницы: 1 2
ПрограммированиеФорумФизика

Тема в архиве.