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.

애니메이션 제어하기

이전 지침을 따르면 많은 게임에서 만족스러운 결과를 얻을 수 있지만 경우에 따라 최상의 결과와 가장 원활한 경험을 얻기 위해 한 단계 더 나아가고 싶을 수도 있습니다.

애니메이션 제어하기

물리 보간이 활성화된 경우에도 :ref:`Node<class_Node>`(또는 :ref:`SceneTree<class_SceneTree>`의 분기)에 대한 자동 보간을 비활성화하고 보간을 수동으로 수행하는 경우 더 세밀하게 제어할 수 있는 로컬 상황이 있을 수 있습니다.

이는 모든 노드에 존재하는 Node.physics_interpolation_mode 속성을 사용하여 가능합니다. 예를 들어 노드에 대한 보간을 끄면 자식 노드도 반복적으로 영향을 받습니다(기본적으로 상위 설정을 상속하므로). 이는 전체 하위 장면에 대한 보간을 쉽게 비활성화할 수 있음을 의미합니다.

../../../_images/physics_interpolation_mode.webp

It is worth noting that, both in 2D and 3D, physics interpolation is performed on the local transform of each instance. During rendering, interpolated local transforms are passed down to children.

This means that if a parent has physics_interpolation_mode set to On, but the child is set to Off, the child will still be interpolated if the parent is moving. Only the child's local transform is uninterpolated. Controlling the on / off behavior of nodes therefore requires some thought and planning.

자신만의 보간을 수행하려는 가장 일반적인 상황은 카메라입니다.

카메라

대부분의 경우 :ref:`Camera3D<class_Camera3D>`는 다른 노드와 마찬가지로 자동 보간을 사용할 수 있습니다. 그러나 특히 낮은 물리 틱 속도에서 최상의 결과를 얻으려면 카메라 보간에 수동 접근 방식을 취하는 것이 좋습니다.

시청자들은 카메라 움직임에 매우 민감하기 때문이다. 예를 들어, 1/10초(10tps 틱 속도)마다 약간씩 재정렬되는 Camera3D는 눈에 띄는 경우가 많습니다. ``_process``에서 각 프레임마다 카메라를 이동하고 보간된 대상을 수동으로 따라가면 훨씬 더 부드러운 결과를 얻을 수 있습니다.

벡터 보간

이 기능은 항상 전반적인 좌표에 적용됩니다.

수동 카메라 보간을 수행할 때 가장 첫 번째 단계는 움직이는 상위의 변환을 상속하는 대신 Camera3D 변환이 *전역 공간*에 지정되어 있는지 확인하는 것입니다. Camera3D의 상위 노드 움직임과 카메라 노드 자체의 움직임 사이에 피드백이 발생하여 보간이 엉망이 될 수 있기 때문입니다.

이렇게 하고 싶어하는 몇 가지 이유가 있습니다:

  1. 움직이는 객체의 하위가 아닌 자체 분기에서 독립적이도록 Camera3D를 이동합니다.

../../../_images/fti_camera_worldspace.webp
  1. :ref:`Node3D.top_level<class_Node3D_property_top_level>`를 호출하고 이를 ``true``로 설정하면 카메라가 상위 변환을 무시하게 됩니다.

예:

사용자 지정 접근 방식의 일반적인 예는 _process()``의 프레임마다 Camera3D의 ``look_at 함수를 사용하여 대상 노드(예: 플레이어)를 보는 것입니다.

하지만 문제가 있습니다. Camera3D "대상" 노드에서 기존 ``get_global_transform()``를 사용하는 경우 이 변환은 현재 물리 틱*에서 대상에만 Camera3D의 초점을 맞춥니다. 이는 우리가 원하는 것이 *아닙니다. 대상이 움직일 때 카메라가 각 물리 틱에서 이리저리 뛰어다니기 때문입니다. 카메라가 프레임마다 업데이트될 수 있더라도 *대상*이 각 물리 틱만 변경하는 경우 부드러운 모션을 제공하는 데 도움이 되지 않습니다.

변형 보간

우리가 실제로 카메라의 초점을 맞추고 싶은 것은 물리 틱의 대상 위치가 아니라 보간된 위치, 즉 대상이 렌더링될 위치입니다.

Node3D.get_global_transform_interpolated 함수를 사용하여 이를 수행할 수 있습니다. 이는 Node3D.global_transform<class_Node3D_property_global_transform>`를 얻는 것과 똑같이 작동하지만 (``_process()` 호출 중) 보간된 변환을 제공합니다.

중요

``get_global_transform_interpolated()``는 카메라와 같은 특수한 경우에는 한 번 또는 두 번만 사용해야 합니다. 성능상의 이유와 올바른 게임플레이를 위해 코드 전체에서 사용해서는 안 됩니다.

참고

카메라와 같은 예외를 제외하면 대부분의 경우 게임 로직은 _physics_process()``에 있어야 합니다. 게임 로직에서는 ``get_global_transform() 또는 ``get_transform()``를 호출해야 하며, 이는 일반적으로 게임플레이 코드에 필요한 현재 물리 변환(각각 전역 또는 로컬 공간에서)을 제공합니다.

GDScript 예제

어떻게 작동하는 지의 예제입니다:

extends Camera3D

# Node that the camera will follow
var _target

# We will smoothly lerp to follow the target
# rather than follow exactly
var _target_pos : Vector3 = Vector3()

func _ready() -> void:
    # Find the target node
    _target = get_node("../Player")

    # Turn off automatic physics interpolation for the Camera3D,
    # we will be doing this manually
    set_physics_interpolation_mode(Node.PHYSICS_INTERPOLATION_MODE_OFF)

func _process(delta: float) -> void:
    # Find the current interpolated transform of the target
    var tr : Transform = _target.get_global_transform_interpolated()

    # Provide some delayed smoothed lerping towards the target position
    _target_pos = lerp(_target_pos, tr.origin, min(delta, 1.0))

    # Fixed camera position, but it will follow the target
    look_at(_target_pos, Vector3(0, 1, 0))

옵션들 가져오기

마우스 모양은 카메라를 제어하는 매우 일반적인 방법입니다. 하지만 문제가 있습니다. 물리 틱에서 주기적으로 샘플링할 수 있는 키보드 입력과 달리 마우스 이동 이벤트는 지속적으로 들어올 수 있습니다. 카메라는 다음 물리 틱이 나올 때까지 기다리지 않고 다음 프레임에서 이러한 마우스 움직임에 반응하고 따라갈 것으로 예상됩니다.

이러한 상황에서는 ``_physics_process``에 적용하는 것보다 카메라 노드(Node.physics_interpolation_mode 사용)에 대한 물리 보간을 비활성화하고 마우스 입력을 카메라 회전에 직접 적용하는 것이 더 나을 수 있습니다.

때로는 특히 카메라의 경우 보간과 비보간을 조합하여 사용하고 싶을 수도 있습니다.

  • 1인칭 카메라는 플레이어 위치에 카메라를 배치할 수 있지만(아마도 Node3D.get_global_transform_interpolated 사용) 보간 없이 마우스 모양에서 카메라 회전을 제어합니다.

  • 3인칭 카메라도 마찬가지로 :ref:`Node3D.get_global_transform_interpolated<class_Node3D_method_get_global_transform_interpolated>`를 사용하여 카메라의 시선(대상 위치)을 결정할 수 있지만 보간 없이 마우스 시선을 사용하여 카메라 위치를 지정할 수 있습니다.

카메라 유형에는 많은 순열과 변형이 있지만 많은 경우 자동 물리 보간을 비활성화하고 이를 직접 처리하면 더 나은 결과를 얻을 수 있다는 점은 분명합니다.

다른 노드에서 보간 비활성화

카메라가 가장 일반적인 예이지만 다른 노드가 자체 보간을 제어하거나 보간되지 않도록 하려는 경우가 많이 있습니다. 예를 들어, 마우스 보기에 따라 회전이 제어되는 탑 뷰 게임의 플레이어를 생각해 보세요. 물리 회전을 비활성화하면 플레이어 회전이 실시간으로 마우스와 일치할 수 있습니다.

MultiMesh 설정

대부분의 시각적 노드는 단일 노드 단일 시각적 인스턴스 패러다임을 따르지만 MultiMesh는 동일한 노드에서 여러 인스턴스를 제어할 수 있습니다. 따라서 인스턴스별 기준으로 보간 기능을 제어하기 위한 몇 가지 추가 기능이 있습니다. 보간된 MultiMesh를 사용하는 경우 이러한 기능을 살펴보아야 합니다.

자세한 내용은 MultiMesh 문서에 나와 있습니다.