Найти тему
Votline

Реализация покачивания камеры в 3D играх на Godot Engine через математику

В прошлый раз мы рассмотрели изменение угла обзора камеры в нашей 3D-игре на движке Godot Engine. В этой статье мы реализуем её покачивание, для большего погружения в нашу игру и динамики.

Реализация этого эффекта будет достигаться с использованием математических функций sin и cos. Вот как они выглядят:

Можете использовать только sin или cos
Можете использовать только sin или cos

Эти функции будут определять движение нашей камеры вдоль осей x и y внутри функции headbob(delta), которую мы создадим:

Перед тем как приступить к этому, создайте и инициализируйте новые переменные: 
var cb_frequency: float var cb_amplitude: float
var cb_time: float
var cb_pos: Vector3
cb_frequency = 2.6
cb_amplitude = 0.08
@onready var camera = $Head/Camera3D
Перед тем как приступить к этому, создайте и инициализируйте новые переменные: var cb_frequency: float var cb_amplitude: float var cb_time: float var cb_pos: Vector3 cb_frequency = 2.6 cb_amplitude = 0.08 @onready var camera = $Head/Camera3D

Разберём код:

  1. cb_time += delta * velocity.length() * float(is_on_floor()) увеличение переменной cb_time на значение, зависящее от скорости (velocity.length()) и факта, находится ли персонаж на земле (is_on_floor() возвращает 1 или 0. Это означает, что если персонаж на земле, то будет происходить покачивание, в противном случае - нет.
  2. Обнуляем переменную cb_pos, присваивая ей значение (0, 0, 0)
  3. cb_pos.y = sin(cb_time * cb_frequency) * cb_amplitude - Использование функции синуса (sin) для вертикального смещения камеры (cb_pos.y).
  4. cb_pos.x = cos(cb_time * cb_frequency) * cb_amplitude - Использование функции косинуса (cos) для горизонтального смещения камеры (cb_pos.x).
  5. camera.transform.origin = cb_pos - Установка новой позиции камеры.

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

В следующей статье мы рассмотрим добавление интерфейса пользователя(GUI) для механики выносливости в нашу игру. Удачи в разработке!