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.
Checking the stable version of the documentation...
Камера від третьої особи з пружинним кронштейном
Вступ
Тривимірні ігри часто мають камеру від третьої особи, яка слідкує за чимось, наприклад персонажем гравця чи транспортним засобом, і обертається навколо них.
У Godot це можна зробити, встановивши Camera3D як дочірнього вузла. Однак, якщо ви спробуєте це без будь-яких додаткових кроків, ви помітите, що камера прорізає геометрію та приховує сцену.
Тут з’являється вузол SpringArm3D.
Що таке пружинна рука?
Пружинний важіль складається з двох основних компонентів, які впливають на його поведінку.
«Довжина» пружинного плеча — це те, наскільки далеко від його загального положення, щоб перевірити на наявність зіткнень:
«Форма» пружинного важеля використовується для перевірки зіткнень. Пружинне плече «змітає» цю форму від її початку до її довжини.
Пружинне плече намагається утримати всіх своїх дітей на кінці своєї довжини. Коли фігура стикається з чимось, діти розміщуються в цій точці зіткнення або поблизу неї:
Пружинне плече з камерою
Коли камеру розміщують як дочірню частину пружинного плеча, піраміда, що представляє камеру, використовуватиметься як форма.
Ця піраміда представляє ближню площину камери:
Примітка
Якщо пружинному важелю надати певну форму, то ця форма використовуватиметься завжди.
Форма камери використовується, лише якщо камера є прямим потомком пружинного важеля.
Якщо форма не надається, а камера не є прямим дочірнім елементом, пружинний важіль повернеться до використання відкидання променів, що є неточним для зіткнень камери та не рекомендується.
У кожному кадрі фізичного процесу пружинна рука виконує рух, щоб перевірити, чи не зіткнулося з чимось:
Коли фігура стикається з чимось, камера розміщується в точці зіткнення або поблизу неї:
Налаштування пружинного кронштейна та камери
Давайте додамо налаштування камери з пружинною рукою до демонстрації платформера.
Примітка
Ви можете завантажити демо-версію Platformer 3D на GitHub або за допомогою Бібліотеки ресурсів.
Загалом, для налаштування камери від третьої особи ви матимете три дочірні вузли вузла, за яким ви стежите:
Node3D ("точка опори" для камери)
SpringArm3D
Camera3D
Відкрийте сцену player/player.tscn. Встановіть їх як дітей нашого гравця та дайте їм унікальні імена, щоб ми могли знайти їх у нашому сценарії. Обов’язково видаліть існуючий вузол камери!
Давайте перемістимо точку повороту вгору на 2 по осі Y, щоб вона не була на землі:
Надайте пружинному плечу довжину 3 так, щоб воно було розташоване за символом:
Примітка
Залиште Форму пружинного плеча як <empty>. Таким чином, він використовуватиме форму піраміди камери.
Якщо ви хочете, ви також можете спробувати інші форми - сфера є звичайним вибором, оскільки вона плавно ковзає по краях.
Оновіть верхню частину 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, щоб перевірити рух камери, а потім відповідно повернути точку повороту:
@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
Обертаючи точку повороту, пружинний важіль також повертатиметься, і він змінюватиме положення камери. Запустіть гру і помітите, що рух миші тепер обертає камеру навколо персонажа. Якщо камера рухається в стіну, вона стикається з нею.