Нужна помощь в изобретении древнего велосипеда. Который сейчас в каждой первой игре есть.
На видео персонаж взбирается на "горку".
Зеленая линия - вектор управления движением (в данном случае задается кнопкой "вперед").
Красная линия - проекция вектора скорости на плоскость XZ (то что он не становится нулевым когда персонаж стоит на месте - это так специально сделано, для наглядности.)
Направление красного вектора должно всегда совпадать с направлением зеленого вектора, то есть персонаж должен всего передвигаться в ту сторону, куда ему указывает вектор управления. Когда персонаж взбирается на "горку" - проекция на плоскость XZ его результирующего вектора скорости (красная линия) отклоняется от вектора управления (зеленая линия). Персонаж как бы проскальзывает и немного съезжает в сторону наклона горки. Я смотрел движение персонажей в Assasin's Creed: Odyssey (пример сложной физики) и Genshin Impact (пример простой физики) - там с этим проблем нет, в независимости от наклона плоскости, по которой перемещается персонаж, она всегда бежит ровно в том направлении куда ему указано, не съезжая.
То есть мне нужно сделать так чтобы красный вектор всегда совпадал с зеленым, при движении по любым "горкам". Интересует, как это делается. Явно как-то с помощью скалярного-векторного произведений нормали коллизии и вертикального вектора (и, быть может, скорости персонажа), но как именно - не могу понять.
Что значит "вектор управления"?
В каждой первой игре обычно используют силу (и разумеется тела с коллизиями) в направлении взгляда.
Чтобы не съезжало, усилить трение.
rcsim
> Что значит "вектор управления"?
Ну, к примеру, орбит-камера смотрит в направлении (1,0,0). Я нажимаю клавишу "вперед", к персонажу применится сила в направлении камеры (1,0,0). Нажму клавишу "назад" - применится сила (-1,0,0). Это, в данном случае, у меня и называется "вектором управления". То есть сила, которая применяется телу при нажатии кнопок управления.
rcsim
> Чтобы не съезжало, усилить трение.
Это я уже пробовал. Трение действует во всех направлениях. Персонаж не только перестает съезжать, но и вообще двигаться на склонах перестает. Это если только ограничивать степень свободы в направлении, перпендикулярном вектору скорости, но тогда вообще жесть начинается в отдельных случаях. И как тогда делают в играх с простой физикой, или где ее вообще почти нет?
Плюс трение убивает такие приятные вещи как скольжение по стенам, капсула персонажа начинает застревать в таких местах как стены сходящиеся под острым углом. Явно как-то по другому делают.
https://github.com/222464/EvolvedVirtualCreaturesRepo/tree/master… jects/Physics
DynamicCharacterController
https://stackoverflow.com/questions/25605659/avoid-ground-collisi… 5502#25725502
MikeNew
> То есть мне нужно сделать так чтобы красный вектор всегда совпадал с зеленым,
> при движении по любым "горкам". Интересует, как это делается.
Чтобы совпадал, нужно взять длину вектора скорости и умножить на нормированный вектор движения:
len = length(velocity)
newVelocity = normalize(movedir) * len
MikeNew
> Персонаж не только перестает съезжать, но и вообще двигаться на склонах перестает.
Применяй трение (его специальное значение) только когда длина твоего "вектора управляющей" силы > 0.
Или обратно пропорционально.
MikeNew
> трение убивает такие приятные вещи как скольжение по стенам
Обычно трение можно задать для пары тел: т.н. "физ. материал".
Стены должны быть скользкими.
lookid
Похоже именно оно и есть, подвешеная над землей капсула на пружине.
Значит теперь сначала понадобится трассировщик лучей, до которого еще руки не дошли. Для сферы и трегольника легко гуглится, OBB - это просто AABB с лучем повернутым на поворот OBB. Для всяких конусов и цилиндров можно приспособить уже имеющийся MPR-алгоритм.
Сколько всего еще нужно делать, пипец.