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.

Telecamera in terza persona con braccio a molla

Introduzione

Nei giochi 3D spesso la telecamera è in terza persona e segue e ruota attorno a qualcosa, come ad esempio un personaggio o un veicolo.

In Godot, si può fare impostando un Camera3D come figlio di un nodo. Tuttavia, se provi a farlo senza altri passaggi, noterai che la telecamera attraversa la geometria e nasconde la scena.

È qui che entra in gioco il nodo SpringArm3D.

Che cos'è un braccio a molla?

Un braccio a molla ha due componenti principali che ne influenzano il comportamento.

La "lunghezza" del braccio è quanto lontano dalla sua posizione globale deve verificare le collisioni:

../../_images/spring_arm_position_length.webp

La "forma" del braccio è ciò che serve per verificare le collisioni. Il braccio a molla "scansiona" seguendo questa forma dalla sua origine verso la sua lunghezza.

../../_images/spring_arm_shape.webp

Il braccio a molla cerca di mantenere tutti i suoi figli alla fine della sua lunghezza. Quando la forma entra in collisione con qualcosa, i figli vengono invece posizionati in o vicino al punto di collisione:

../../_images/spring_arm_children.webp

Braccio a molla con una telecamera

Quando una telecamera è inserita come figlio di un braccio a molla, sarà utilizzata una piramide che rappresenta la telecamera come sua forma .

Questa piramide rappresenta il piano vicino della telecamera:

../../_images/spring_arm_camera_shape.webp

Nota

Se al braccio a molla è assegnata una forma specifica, quella forma sarà sempre utilizzata.

La forma della telecamera è utilizzata solo se la telecamera è un figlio diretto del braccio a molla.

Se nessuna forma è fornita e la telecamera non è un nodo figlio diretto, il braccio a molla ricorrerà a un raycast, che è impreciso per le collisioni della telecamera e non è consigliato.

Ad ogni frame di processo fisico, il braccio a molla effettuerà un motion cast per verificare se qualcosa vi è entrato in collisione:

../../_images/spring_arm_camera_motion_cast.webp

Quando la forma colpisce un oggetto, la telecamera sarà posizionata esattamente o vicino al punto di collisione:

../../_images/spring_arm_camera_collision.webp

Configurare il braccio a molla e la telecamera

Aggiungiamo un sistema di telecamera con braccio a molla alla demo piattaforme.

Nota

È possibile scaricare la demo Platformer 3D da GitHub oppure attraverso la Libreria dei contenuti.

In generale, per un sistema di telecamera in terza persona, avrai tre nodi come figli del nodo che stai seguendo:

  • Node3D (the "pivot point" for the camera)

    • SpringArm3D

      • Camera3D

Apri la scena player/player.tscn. Imposta questi elementi come figli del nostro giocatore e assegna loro nomi univoci così da poterli trovare nel nostro script. Assicurati di eliminare il nodo telecamera esistente!

../../_images/spring_arm_editor_setup.webp

Spostiamo il punto perno di 2 verso l'alto sull'asse Y in modo che non si trovi a terra:

../../_images/spring_arm_pivot_setup.webp

Dai al braccio a molla una lunghezza di 3 in modo che sia posizionato dietro il personaggio:

../../_images/spring_arm_length_setup.webp

Nota

Lascia Shape del braccio a molla come <vuoto>. In questo modo, utilizzerà la forma piramidale della telecamera.

Se vuoi, puoi anche provare altre forme: una sfera è una scelta comune perché scorre agevolmente lungo i bordi.

Aggiorna la parte superiore di player/player.gd per recuperare la telecamera e i punti perno tramite i loro nomi univoci:

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

Aggiungi una funzione _unhandled_input per verificare il movimento della telecamera e ruotare di conseguenza il punto perno:

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

Ruotando il punto perno, anche il braccio a molla ruoterà, cambiando la posizione della telecamera. Avvia il gioco e noterai che ora il movimento del mouse fa ruotare la telecamera attorno al personaggio. Se la telecamera si muove contro un muro, lo urta.