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...
스프링 암이 있는 3인칭 카메라
소개
3D 게임에는 플레이어 캐릭터나 차량과 같은 물체를 따라가고 그 주위를 회전하는 3인칭 카메라가 있는 경우가 많습니다.
Godot에서는 :ref:`Camera3D <class_Camera3D>`를 노드의 자식으로 설정하여 이를 수행할 수 있습니다. 그러나 추가 단계 없이 이 작업을 시도하면 카메라가 형상을 통과하여 씬을 숨기는 것을 알 수 있습니다.
이것이 SpringArm3D 노드가 들어오는 곳입니다.
스프링 암이 무엇입니까?
스프링 암에는 동작에 영향을 미치는 두 가지 주요 구성 요소가 있습니다.
스프링 암의 "길이"는 충돌을 확인하기 위해 전역 위치에서 얼마나 떨어져 있는지를 나타냅니다.
스프링 암의 "모양"은 충돌을 확인하는 데 사용됩니다. 스프링 암은 이 모양을 원점에서 길이 방향으로 "스윕"합니다.
스프링 암은 모든 자식 노드를 길이 끝에 유지하려고 합니다. 모양이 무언가와 충돌하면 대신 자식 노드가 해당 충돌 지점이나 그 근처에 배치됩니다.
스크립트 추가하기
카메라가 스프링 암의 하위 항목으로 배치되면 카메라를 나타내는 피라미드가 모양으로 사용됩니다.
이 피라미드는 카메라의 **근접 평면**을 나타냅니다.
참고
스프링 암에 특정 모양이 지정되면 해당 모양이 항상 사용됩니다.
카메라의 모양은 카메라가 스프링 암의 **직계 하위**인 경우에만 사용됩니다.
모양이 제공되지 않고 카메라가 직접 자식이 아닌 경우 스프링 암은 카메라 충돌에 대해 부정확하고 권장되지 않는 광선 투사를 사용하게 됩니다.
모든 물리 프로세스 프레임에서 스프링 암은 모션 캐스트를 수행하여 다음 항목과 충돌하는지 확인합니다.
모양이 무언가에 부딪치면 카메라는 충돌 지점이나 충돌 지점 근처에 배치됩니다.
씬 설정하기
플랫폼 데모에 스프링 암 카메라 설정을 추가해 보겠습니다.
참고
GitHub 또는 Asset Library 를 사용해서 Platformer3D 데모를 다운로드할 수 있습니다.
일반적으로 3인칭 카메라 설정의 경우 팔로우하는 노드의 자식 노드로 3개의 노드가 있습니다.
`Node3D`(카메라의 "피벗 포인트")
String[]카메라
player/player.tscn 씬을 엽니다. 이를 플레이어의 자식 노드로 설정하고 스크립트에서 찾을 수 있도록 고유한 이름을 지정합니다. 기존 카메라는 꼭 삭제하세요 노드!
지면에 있지 않도록 피벗점을 Y축에서 ``2``만큼 위로 이동해 보겠습니다.
스프링 암의 길이를 ``3``로 지정하여 캐릭터 뒤에 배치되도록 합니다.
참고
스프링 암의 모양을 <비었음>으로 두세요. 이 방법은 카메라의 피라미드 모양을 사용합니다.
원할 경우 다른 모양을 시도해 볼 수도 있습니다. 구는 가장자리를 따라 부드럽게 미끄러지기 때문에 일반적인 선택입니다.
``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
피벗 포인트를 회전하면 스프링 암도 회전하여 카메라 위치가 변경됩니다. 게임을 실행하고 이제 마우스 움직임에 따라 캐릭터 주위로 카메라가 회전하는 것을 확인하세요. 카메라가 벽으로 이동하면 벽과 충돌합니다.