Дикс и геймдев
34 subscribers
197 photos
59 videos
5 files
64 links
Переучиваюсь на геймдев - igroprom.d3.ru
Download Telegram
Channel photo updated
Channel name was changed to «Дикс и геймдев»
Я выяснил что d3.ru заблочен в Беларуси. Поэтому тут больше не будет ссылок на Дёрти, а будут полныя тексты моих постов.

Уведомления же о постах будут появляться, как и раньше, на https://t.me/gribnoyrukav
Очень хочется снова маппить для ку2, но я вспоминаю все нерешаемые ограничения в которые я упирался несколько лет, и с утроенной силой продолжаю грызть гранит курса Gamecode по UE.

По курсу Gamecode — только что закончил последнюю домашку по разделу FPS — жесткое приземление, как в Mirror's edge.
Следующий раздел, которого я так долго жду, по созданию оружию, видимо придется начинать в январе.

Сейчас нужно закончить последний в этом году спринт по С++ у яндекса — шестой по счету. Там что–то про оптимизацию кода и сложность алгоритмов.

Ну и меня всегда ждут масса несмотренных стримов по UE (XYZ School) и книжка "James M. Van Verth — Essential Mathematics for Games and Interactive Applications".
Я из нее освоил раздел Vectors. На очереди Points, Lines, Planes, Polygons & triangles.
Очень нравится изложение материала, каждая абстрактная сущность раскрывается достаточно глубоко.

После раздела с векторами я хорошо понимаю что такое базис и почему в трехмерной системе координат именно 3 измерения, почему они расположены под прямыми углами друг к другу, в чем разница между i,j,k и x,y,z.

Также, приобретена красивая бумажная книжка "Паттерны программирования игр", онлайн–вариант которой находится здесь — https://www.gameprogrammingpatterns.com/
Рано или поздно осилю и её.
Предыдущая домашка заключалась в оптимизации спуска по тросу для FPS — https://www.youtube.com/watch?v=F0APuhJaTYc
2022-12-23 11-23-29.mkv
2.7 MB
Возвращение к веревке
Как бы заливать видео в телегу, чтобы тут сразу было превью?

Решил закрыть старый гештальт - добавить к спуску по зиплайну ускорение.

Для этого потребовалось переделать код в PhysZipline с Lerp на VinterpConstTo

Пока работает не слишком гладко, перемещение заканчивается над столбом. Но все же лучше чем вчера, когда персонаж уезжал вправо и по кривой, замедляясь, а не ускоряясь 😁
Такие гештальты нельзя не закрывать, иначе как я потом создам свой управляемый броневик Потёмкин, который можно видеть на видео?
Остался у меня незакрытый гештальт с прошлой домашки. Неприятно было осознавать, что я не знаю как правильно сделать ускорение.

Вот вроде просто — к вектору скорости добавлять вектор ускорения. Но его же надо увеличивать, а значит где–то накапливать. И обнулять после детача от веревки? Все так и получилось.

Но для перемещения я использовал Lerp и с ним у меня ничего не работало.

Для реализации ускорения, пришлос переписать весь код PhysZipline. Теперь интерполяция осуществляется с помощью FMath::VInterpConstantTo(Start, End, DeltaTime, Speed)

Сложность была в том, чтобы узнать правильную конечную точку. Недостаточно взять точку, расположенную на вершине второго столба!

Start находится в GetActorLocation(), это середина тела персонажа. Но если от вершины второго столба опуститься на половину высоты капсулы (да еще учесть оффсет, задаваемый вручную, чтобы рука точно попадала на веревку), все равно не удается правильно спозиционировать персонажа — к концу движения он непременно оказывается либо ниже веревки, либо выше.

Помог код изначального аттача к веревке:

1 получаем вектор от начала к концу веревки, вычитанием точек. Нормализуем
2 получаем проекцию вектора от первого столба к центру игрока, на веревку — DotProduct
3 проекция это float, умножаем его на вектор из п.1, получаем вектор от начала веревки до текущей точки на ней, где расположен персонаж
4 положение игрока = первый столб + вектор из п.3 + вручную задаваемый оффсет

В PhysZipline рассчитываем точку End:

— берем второй столб, к нему прибавляем вектор из п. 3
— очевидно получается вектор, идущий из второго столба дальше по направлению веревки

Также рассчитываем момент, когда перед вторым столбом, персонаж отпускает веревку
Для этого сравниваем проекцию текущего положения игрока на веревку (сколько "проехали") с длиной веревки, из которой вычтен вручную задаваемый оффсет с конца (чтобы отцепляться от веревки не у самого столба, а чуть раньше)

if (GetActorToZiplineProjection(NewLoc) > (CurrentZipline–>GetSize() — CurrentZipline–>GetZiplineDetachOffset()))
{
DetachFromZipline();
}

Уф, сам до конца не понимаю как все работает. И есть ощущение, что код можно значительно сократить. Но пока этого достаточно, нужно двигаться вперед.
Мозгу требуется время, чтобы в нем укоренились все абстрактные конструкции, которыми мы оперируем, чтобы он мог использовать их быстро и эффективно.
👍1
Настало время продолжить изучение стримов по UE. Всего их 3 части, первую я смотрел ранее, сегодня планирую осилить 2 и 3.

Тогда до НГ мне останется только сделать 6й спринт по С++, опционально читать Essential math и паттерны программирования игр.

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

На Игропром такое выкладывать стыдно, а сюда - в самый раз 😃
Карта зависимостей блупринта персонажа

Здесь мы видим скелет персонажа, меш, материалы и текстуры, анимации для разных механик, кривые (3 штуки, внизу) для плавного движения в тех или иных случаях, анимационный блупринт который смешивает анимации между собой и включает нужную