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.

RigidBody2D 사용하기

리지드 바디가 무엇입니까?

리지드 바디는 물리적 오브젝트의 행동을 시뮬레이션 하기 위해 물리 엔진으로 직접 다루는 바디입니다. 바디의 모양을 정의하려면 하나 이상의 Shape 오브젝트가 지정되어 있어야 합니다. 이러한 모양의 위치를 설정하면 바디의 무게 중심에 영향을 미칩니다.

리지드 바디를 제어하는 방법

리지드 바디의 동작은 마찰, 질량, 바운스 등의 속성을 설정하여 변경할 수 있습니다. 이러한 속성은 인스펙터나 코드를 통해 설정할 수 있습니다. 속성과 그 효과의 전체 목록은 RigidBody를 참고하세요.

원하는 용도에 따라 리지드 바디의 움직임을 제어하는 몇 가지 방법이 있습니다.

예를 들어, 초기 위치를 설정하기 위해 리지드 바디를 한 번만 배치해야 된다면 set_global_transform() 또는 look_at()과 같은 Spatial 노드가 제공하는 메서드를 사용할 수 있습니다. 그러나 이 메서드들이 모든 프레임을 호출하지 못하거나 물리 엔진이 바디 상태를 정확하게 시뮬레이션 할 수 없을 것입니다. 예를 들어, 다른 물체를 가리키도록 회전할 리지드 바디를 고려하는것이 있습니다. 이런 행동을 시행할 때 흔히 저지르는 실수는 look_at()을 모든 프레임에 사용하는 것인데 이것은 물리학적 시뮬레이션을 깨뜨리게 됩니다. 아래에서는, 이를 올바르게 구현하는 방법을 시연합니다.

set_global_transform()이나 look_at()의 방법을 사용할 수 없다는 사실이 리지드 바디를 완전히 통제할 수 없다는 것을 의미하지는 않습니다. 대신 _integrate_forces() 콜백을 사용하여 제어할 수 있습니다. 이 기능에서 원하는 이동을 달성하기 위해 forces를 추가하거나 impulses를 적용하거나 velocity를 설정할 수 있습니다.

"look at" 메서드

위에서 설명한 것처럼, Node3D의 look_at() 메서드를 각 프레임에 사용하여 대상을 따라가도록 할 수는 없습니다. 다음은 리지드 바디에서 안정적으로 작동하는 look_follow()라 불리는 커스텀 look_at() 메서드입니다:

extends RigidBody3D

var speed: float = 0.1

func look_follow(state: PhysicsDirectBodyState3D, current_transform: Transform3D, target_position: Vector3) -> void:
    var forward_local_axis: Vector3 = Vector3(1, 0, 0)
    var forward_dir: Vector3 = (current_transform.basis * forward_local_axis).normalized()
    var target_dir: Vector3 = (target_position - current_transform.origin).normalized()
    var local_speed: float = clampf(speed, 0, acos(forward_dir.dot(target_dir)))
    if forward_dir.dot(target_dir) > 1e-4:
        state.angular_velocity = local_speed * forward_dir.cross(target_dir) / state.step

func _integrate_forces(state):
    var target_position = $my_target_node3d_node.global_transform.origin
    look_follow(state, global_transform, target_position)

이 방법은 강체의 angular_velocity 속성을 사용하여 몸체를 회전합니다. 회전할 축은 현재 순방향과 보고자 하는 방향 사이의 외적에 의해 제공됩니다. ``clamp``는 필요한 총 회전량이 내적의 아크코사인에 의해 제공되므로 회전량이 보고 싶은 방향을 벗어나는 것을 방지하는 데 사용되는 간단한 방법입니다. 이 방법은 ``axis_lock_angular_*``에서도 사용할 수 있습니다. 보다 정밀한 제어가 필요한 경우 :ref:`doc_using_transforms`에서 설명한 대로 :ref:`class_Quaternion`를 사용하는 솔루션과 같은 솔루션이 필요할 수 있습니다.