Камера від третьої особи з пружинним кронштейном

Вступ

Тривимірні ігри часто мають камеру від третьої особи, яка слідкує за чимось, наприклад персонажем гравця чи транспортним засобом, і обертається навколо них.

У Godot це можна зробити, встановивши Camera3D як дочірнього вузла. Однак, якщо ви спробуєте це без будь-яких додаткових кроків, ви помітите, що камера прорізає геометрію та приховує сцену.

Тут з’являється вузол SpringArm3D.

Що таке пружинна рука?

Пружинний важіль складається з двох основних компонентів, які впливають на його поведінку.

«Довжина» пружинного плеча — це те, наскільки далеко від його загального положення, щоб перевірити на наявність зіткнень:

../../_images/spring_arm_position_length.webp

«Форма» пружинного важеля використовується для перевірки зіткнень. Пружинне плече «змітає» цю форму від її початку до її довжини.

../../_images/spring_arm_shape.webp

Пружинне плече намагається утримати всіх своїх дітей на кінці своєї довжини. Коли фігура стикається з чимось, діти розміщуються в цій точці зіткнення або поблизу неї:

../../_images/spring_arm_children.webp

Пружинне плече з камерою

Коли камеру розміщують як дочірню частину пружинного плеча, піраміда, що представляє камеру, використовуватиметься як форма.

Ця піраміда представляє ближню площину камери:

../../_images/spring_arm_camera_shape.webp

Примітка

Якщо пружинному важелю надати певну форму, то ця форма використовуватиметься завжди.

Форма камери використовується, лише якщо камера є прямим потомком пружинного важеля.

Якщо форма не надається, а камера не є прямим дочірнім елементом, пружинний важіль повернеться до використання відкидання променів, що є неточним для зіткнень камери та не рекомендується.

У кожному кадрі фізичного процесу пружинна рука виконує рух, щоб перевірити, чи не зіткнулося з чимось:

../../_images/spring_arm_camera_motion_cast.webp

Коли фігура стикається з чимось, камера розміщується в точці зіткнення або поблизу неї:

../../_images/spring_arm_camera_collision.webp

Налаштування пружинного кронштейна та камери

Давайте додамо налаштування камери з пружинною рукою до демонстрації платформера.

Примітка

Ви можете завантажити демо-версію Platformer 3D на GitHub або за допомогою Бібліотеки ресурсів.

Загалом, для налаштування камери від третьої особи ви матимете три дочірні вузли вузла, за яким ви стежите:

  • Node3D ("точка опори" для камери)

    • SpringArm3D

      • Camera3D

Відкрийте сцену player/player.tscn. Встановіть їх як дітей нашого гравця та дайте їм унікальні імена, щоб ми могли знайти їх у нашому сценарії. Обов’язково видаліть існуючий вузол камери!

../../_images/spring_arm_editor_setup.webp

Давайте перемістимо точку опори вгору на «2» по осі Y, щоб вона не була на землі:

../../_images/spring_arm_pivot_setup.webp

Надайте пружинному плечу довжину 3 так, щоб воно було розташоване за символом:

../../_images/spring_arm_length_setup.webp

Примітка

Залиште Форму пружинного плеча як <empty>. Таким чином, він використовуватиме форму піраміди камери.

Якщо ви хочете, ви також можете спробувати інші форми - сфера є звичайним вибором, оскільки вона плавно ковзає по краях.

Оновіть верхню частину player/player.gd, щоб отримати камеру та опорні точки за їхніми унікальними назвами:

player/player.gd
# Comment out this existing camera line.
# @onready var _camera := $Target/Camera3D as Camera3D

@onready var _camera := %Camera3D as Camera3D
@onready var _camera_pivot := %CameraPivot as Node3D

Додайте функцію _unhandled_input, щоб перевірити рух камери, а потім відповідно повернути точку повороту:

player/player.gd
@export_range(0.0, 1.0) var mouse_sensitivity = 0.01
@export var tilt_limit = deg_to_rad(75)


func _unhandled_input(event: InputEvent) -> void:
    if event is InputEventMouseMotion:
        _camera_pivot.rotation.x -= event.relative.y * mouse_sensitivity
        # Prevent the camera from rotating too far up or down.
        _camera_pivot.rotation.x = clampf(_camera_pivot.rotation.x, -tilt_limit, tilt_limit)
        _camera_pivot.rotation.y += -event.relative.x * mouse_sensitivity

Обертаючи точку повороту, пружинний важіль також повертатиметься, і він змінюватиме положення камери. Запустіть гру і помітите, що рух миші тепер обертає камеру навколо персонажа. Якщо камера рухається в стіну, вона стикається з нею.