06-02-2020, 08:09 AM
В общем случае нужно получить нормаль поверхности под ногами персонажа и присвоить ее вектору Up:
characterPointerDown в данном случае - это даммикуб, привязанный к персонажу и повернутый вниз на 90 градусов:
Для сферы это будет работать хорошо, как и для любых гладких тел, но вот с кубами сложнее. Самое простое, думаю, использовать куб со скругленными краями (чем больше радиус скругления, тем лучше).
Также в случае с кубами скорее всего нужно будет как-то смягчать резкие переходы нормали, тут все зависит от того, как реализуется механика движения. Если есть гравитация, и все построено на физике, то возможно и не надо будет смягчать.
Код:
[== C++ ==]
ux = ObjectGetAbsoluteUp(character, 0);
uy = ObjectGetAbsoluteUp(character, 1);
uz = ObjectGetAbsoluteUp(character, 2);
if (ObjectRaycast(characterPointerDown, planet))
{
ux = ObjectGetCollisionNormal(0);
uy = ObjectGetCollisionNormal(1);
uz = ObjectGetCollisionNormal(2);
}
ObjectSetAbsoluteUp(character, ux, uy, uz);
characterPointerDown в данном случае - это даммикуб, привязанный к персонажу и повернутый вниз на 90 градусов:
Код:
[== C++ ==]
characterPointerDown = DummycubeCreate(character);
ObjectPitch(characterPointerDown, -90);
Для сферы это будет работать хорошо, как и для любых гладких тел, но вот с кубами сложнее. Самое простое, думаю, использовать куб со скругленными краями (чем больше радиус скругления, тем лучше).
Также в случае с кубами скорее всего нужно будет как-то смягчать резкие переходы нормали, тут все зависит от того, как реализуется механика движения. Если есть гравитация, и все построено на физике, то возможно и не надо будет смягчать.