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

Прямолинейное движение персонажа по наклонной плоскости

#0
(Правка: 16:32) 16:31, 3 янв. 2021

Нужна помощь в изобретении древнего велосипеда. Который сейчас в каждой первой игре есть.

На видео персонаж взбирается на "горку".
Зеленая линия - вектор управления движением (в данном случае задается кнопкой "вперед").
Красная линия - проекция вектора скорости на плоскость XZ (то что он не становится нулевым когда персонаж стоит на месте -  это так специально сделано, для наглядности.)

Направление красного вектора должно всегда совпадать с направлением зеленого вектора, то есть персонаж должен всего передвигаться в ту сторону, куда ему указывает вектор управления. Когда персонаж взбирается на "горку" - проекция на плоскость XZ его результирующего вектора скорости (красная линия) отклоняется от вектора управления (зеленая линия). Персонаж как бы проскальзывает и немного съезжает в сторону наклона горки. Я смотрел движение персонажей в Assasin's Creed: Odyssey (пример сложной физики) и Genshin Impact (пример простой физики) - там с этим проблем нет, в независимости от наклона плоскости, по которой перемещается персонаж, она всегда бежит ровно в том направлении куда ему указано, не съезжая.

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

Запустить видео по клику - Как делать игрыЗапустить видео по клику - Как делать игры

#1
17:39, 3 янв. 2021

Что значит "вектор управления"?
В каждой первой игре обычно используют силу (и разумеется тела с коллизиями) в направлении взгляда.
Чтобы не съезжало, усилить трение.

#2
(Правка: 18:16) 18:09, 3 янв. 2021

rcsim
> Что значит "вектор управления"?
Ну, к примеру, орбит-камера смотрит в направлении (1,0,0). Я нажимаю клавишу "вперед", к персонажу применится сила в направлении камеры (1,0,0). Нажму клавишу "назад" - применится сила (-1,0,0). Это, в данном случае, у меня и называется "вектором управления". То есть сила, которая применяется телу при нажатии кнопок управления.

rcsim
> Чтобы не съезжало, усилить трение.
Это я уже пробовал. Трение действует во всех направлениях. Персонаж не только перестает съезжать, но и вообще двигаться на склонах перестает. Это если только ограничивать степень свободы в направлении, перпендикулярном вектору скорости, но тогда вообще жесть начинается в отдельных случаях. И как тогда делают в играх с простой физикой, или где ее вообще почти нет?

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

#3
(Правка: 18:54) 18:52, 3 янв. 2021

https://github.com/222464/EvolvedVirtualCreaturesRepo/tree/master… jects/Physics
DynamicCharacterController
https://stackoverflow.com/questions/25605659/avoid-ground-collisi… 5502#25725502

#4
21:03, 3 янв. 2021

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

Чтобы совпадал, нужно взять длину вектора скорости и умножить на нормированный вектор движения:

len = length(velocity)
newVelocity = normalize(movedir) * len

#5
(Правка: 21:58) 21:49, 3 янв. 2021

MikeNew
> Персонаж не только перестает съезжать, но и вообще двигаться на склонах перестает.

Применяй трение (его специальное значение) только когда длина твоего "вектора управляющей" силы > 0.
Или обратно пропорционально.

MikeNew
> трение убивает такие приятные вещи как скольжение по стенам

Обычно трение можно задать для пары тел: т.н. "физ. материал".
Стены должны быть скользкими.

#6
17:41, 4 янв. 2021

lookid
Похоже именно оно и есть, подвешеная над землей капсула на пружине.
Значит теперь сначала понадобится трассировщик лучей, до которого еще руки не дошли. Для сферы и трегольника легко гуглится, OBB - это просто AABB с лучем повернутым на поворот OBB. Для всяких конусов и цилиндров можно приспособить уже имеющийся MPR-алгоритм.
Сколько всего еще нужно делать, пипец.

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