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

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

Страницы: 122 23 24 2537 Следующая »
#330
(Правка: 22:46) 22:29, 24 сен. 2018

vindast
> Объясни попроще как ты предлагаешь сделать псевдоскорости.
Я предполагаю отказываться от псевдоскоростей в джоинтах ибо они там не нужны , лутше ограничивать степени свободы на прямую к позиции и ориентации тела! Так стабильнее!

vindast
> но вопрос со знаком поворота все равно останется.
Если нужен знак+- для угла между векторами отнсительно нормали плоскости то так

static T SIMD_INLINE AngleSigned(IVector3D<T> v1, IVector3D<T> v2, IVector3D<T> normal)
    {
        return IAtan2( normal.Dot(v1.Cross(v2)), v1.Dot(v2));
    }

vindast
Можеш сделать систему из 30-40 тел соединеную джойнтами  , и кинуть так чтоб сложылась куча ?


#331
1:51, 25 сен. 2018

werasaimon
> vindast
> Можеш сделать систему из 30-40 тел соединеную джойнтами  , и кинуть так чтоб
> сложылась куча ?
Он еще до этого не дорос + кривая система колизий которую тоже надо  переделать как ни крути.

#332
1:53, 25 сен. 2018

werasaimon
> return IAtan2( normal.Dot(v1.Cross(v2)), v1.Dot(v2));
Сомневаюсь что это дешевле чем определитель матрицы 3 * 3

#333
5:55, 25 сен. 2018

vindast
> Сомневаюсь что это дешевле чем определитель матрицы 3 * 3
это буквально точное тоже самое что и через матрицу 3 * 3 !

vindast
> Он еще до этого не дорос + кривая система колизий которую тоже надо  переделать
> как ни крути.
Эсли у тебя проблемы с определениям коллизий и нахождением нормали коллизии ,
то вот код GJK-EPA может пригодиться
https://github.com/werasaimon/gjk-epa

#334
(Правка: 8:32) 8:18, 25 сен. 2018

werasaimon, спасибо за код конеш (я не смотел), но я хочу сделать коллизии потом когда отлажу свою систему с колесами vs рейкаст об тримешь до приемлемого состояния. А потом уже мутить коллизии. Я в любом случая сначала попытаюсь в сделать все сам. А уже потом если обосрусь буду писать тут помагите помагите )

#335
8:18, 25 сен. 2018

werasaimon
Я так понял там просто угол со знаком? я просто не сразу увидел мудрость в atan2)

#336
(Правка: 8:22) 8:20, 25 сен. 2018

Suslik, посмотрите пожалуйста пост https://gamedev.ru/code/forum/?id=235421&page=22#m328 и https://gamedev.ru/code/forum/?id=235421&page=22#m329
Скажите нормально или нет?

#337
(Правка: 8:27) 8:27, 25 сен. 2018

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

#338
8:31, 25 сен. 2018

Suslik, так ведь они в общем случае не перпендикуляры, могут "разъехаться". Или не важно что небольшая погрешность?

#339
8:33, 25 сен. 2018

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

#340
(Правка: 13:26) 13:19, 25 сен. 2018

Написал вот такую функцию

inline void updateAxisJoint(
                const vec3& axis, //Сама ось по которой нельзя вращаться
                const vec3& n1,   //первый перпендикуляр к ней
                const vec3& n2,   //второй перпендикуляр к ней
                const vec3& a1,   //a1 и a2 оси которые надо совместить в проекциях на плоскость,
                const vec3& a2,   //перпендикулярную оси вращения
                TJacobian&  j
  )
  {
    vec2 v1(dot(a1, n1), dot(a1, n2)); //проецируем первую ось
    vec2 v2(dot(a2, n1), dot(a2, n2)); //проецируем вторую ось
 
    float depth = dot(v1, v2);             //косинус угла между проекциями осей
    depth = clamp(depth, -1.0f, 1.0f); //Усекаем по -1, 1 по тому что нет нормализации
    depth = acos(depth);  //Угол

    mat3 m(a1, a2, axis); //Для определения тройки векторов

    depth *= sign(determinant(m)); // 

    setUpHindje(j, axis, depth * ERP);
  }

Работает как должно. И так, может проще можно вычислить глубину?

#341
(Правка: 16:45) 16:22, 25 сен. 2018

Как сделать джоинт вида a <= jv <= b?
Или это просто разбивка на два джоинта? Думаю как в джоинте подвески ограничить ход)

#342
16:33, 25 сен. 2018

vindast
вообще-то джойнт подвески может быть в трёх состояниях: ограничен сверху, не ограничен, ограничен снизу. поэтому джойнт всегда будет вида jv = 0, но условие на то, какие значения может принимать импульс в нём, будет определяться состоянием.

#343
(Правка: 16:38) 16:38, 25 сен. 2018

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

#344
16:47, 25 сен. 2018

vindast
то, как я описал постом выше, делается джойнт на жёсткое ограничение подвески, которое ограничивает её вертикальный ход. упруго-вязкая сила моделируется не так. если в двух словах, то можно поставить условие вида
[cht]\array \left \{ jv = -f \Delta  \\ \left|\lambda \right| < k\left|\Delta \right| \cdot dt[/cht]
здесь f — это максимальная частота, с которой разрешается вибрировать джойнту, k — его жёсткость. если [cht]f \rightarrow +\infty[/cht], то джойнт переходит в обычный джойнт, управляемый силой, так как получится эквивалентен
[cht]\lambda = k \Delta \cdot dt[/cht]. если принять [cht]f = 0[/cht], [cht]k = +\infty[/cht], то джойнт переходит в джойнт абсолютного трения [cht]jv = 0[/cht]. интересные значения лежат в промежуточных значениях. но, повторюсь, это нужно только для случая, когда не хватает устойчивости моделировать подвеску, просто прикладывая к ней силы. для случая автомобиля это должно быть вполне возможно без дополнительных телодвижений.

Страницы: 122 23 24 2537 Следующая »
ПрограммированиеФорумФизика