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

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

Страницы: 127 28 29 3035 Следующая »
#405
13:48, 8 окт. 2018

MikeNew
> Смешанным произведением векторов как вариант.
Не понял. Таким способом можно определить только лежит ли точка в плоскости треугольника. (dot(P - A, cross(B - A, C - A))
Или я не то подумал?

ps:
Пост https://gamedev.ru/code/forum/?id=235421&page=27#m403 очень актуально.


#406
(Правка: 14:53) 14:53, 8 окт. 2018

Я тут понял что я не так делал (нашел в интернетах подобный вопрос) . Нужно из всего списка треугольников, который виден с нового экстремума оставить только те ребра, которые лежат только в одном треугольнике.
Новый вопрос: как сделать такую штуку эффективно? Ну очевидный способ я, разумеется, увидел. Просто проверяем лежит ли каждое ребро только в одном треугольнике, если да то добавляем новый треугольник с ним экстремумом, иначе ничего не делаем.

#407
16:47, 8 окт. 2018

vindast, эту статью видел? http://hacktank.net/blog/?p=119

#408
17:08, 8 окт. 2018

nullptr, да, да видел. Но не понял как он проверяет ребро на уникальность.

Я Уже сделал решение в лоб:

#409
18:50, 8 окт. 2018

vindast
> Но не понял как он проверяет ребро на уникальность.
Он пробегается по всем треугольникам и определяет какие из них видны со стороны новой опорной точки.
Перед удалением этих треугольников он добавляет все их ребра в список.
При добавлении ребер он проверяет есть ли в списке ребра с такими же координатами вершин, но направленные в противоположенную сторону (if(newEdge.a == oldEdge.b && newEdge.b == oldEdge.a)). Если есть, то новое не добавляется, а старое удаляется.
Из оставшихся ребер и опорной точки строятся новые треугольники, которые закрывают дыру.

#410
19:01, 8 окт. 2018

nullptr, спс. Попробую так сделать.

#411
(Правка: 4:14) 4:08, 10 окт. 2018

Сделал я. И алгоритм построения контактных площадок  тоже (Axis rotation). Только получается что все нормально работает в контактах фейс / фейс, фейс / ребро, ребро / ребро, а вот с вершина / фейс все очень печально. (пока только боксы смотрел)

Забить на это? 

#412
4:29, 10 окт. 2018

vindast
> вершина / фейс
это как бы самый базовый случай. проверяй ещё.

#413
(Правка: 4:40) 4:38, 10 окт. 2018

Suslik, а как Вы у себя считали устредненную нормаль?
Я сейчас проверяю что новый сапорт поинт != старый, и соответственно добавляю новую точку в полигон и увеличиваю сумму нормалей.

А потом после обхода normal = NormalSum / count

Иногда получается, что нормаль чуть чуть отклонена от настоящей. Но нужная точка отсекается.

#414
(Правка: 5:14) 5:13, 10 окт. 2018

У меня тут еще один вопрос возник.
По поводу саппорт мапинга. А что делать есть есть несколько экстремумов в одном направлении? На пример бокс и нормаль его грани - 4 штуки.

#415
5:53, 10 окт. 2018

vindast
> А что делать есть есть несколько экстремумов в одном направлении?
выбирать любой

vindast
> Я сейчас проверяю что новый сапорт поинт != старый, и соответственно добавляю
> новую точку в полигон и увеличиваю сумму нормалей.
> А потом после обхода normal = NormalSum / count
примерно так же, только нормали надо не усреднять(это собъёт нормализацию), а просто нормализовать полученную взвешенную сумму.

#416
14:20, 10 окт. 2018

Suslik
> взвешенную
?????????????
По какому принципу?

#417
18:23, 10 окт. 2018

vindast
я складываю с весами, равными углу относительно центра масс. не знаю, может быть, можно умнее.

#418
(Правка: 22:07) 21:56, 10 окт. 2018

Suslik,

normalAVG += dot(Normal[i], normalize(Centr)) * Normal[i];
PlaneNormal = normalize(normalAVG);

Так?

#419
20:14, 11 окт. 2018

Даже не знаю что я не так сделал.

бокс vs бокс, 8 осей, eps = 0.3


Страницы: 127 28 29 3035 Следующая »
ПрограммированиеФорумФизика