Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

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

Вступ

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

У 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:
    # Mouselook implemented using `screen_relative` for resolution-independent sensitivity.
    if event is InputEventMouseMotion:
        _camera_pivot.rotation.x -= event.screen_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.screen_relative.x * mouse_sensitivity

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