리지드바디 (Rigidbody)

Rigidbody는 사용자의 GameObjects가 물리력의 제어 하에서 동작 할 수 있게 하여 준다. 리지드바디는 사용자의 오브젝트가 현실 세상처럼 움직이게 만들어 힘과 회전력을 적용할 수 있게 하여 준다. GameObject는 중력의 영향을 받고 스크립트를 통해 추가된 힘의 영향력 하에 있거나, NVIDIA PhysX 물리력 엔진을 통하여 다른 오브젝트와 상호작용을 하려면, 반드시 Rigidbody을 포함하여야 함.

상호작용하는 모든 물체가 리지드바디 컴포넌트를 가져야 하는 것은 아니다. 예를 들어 배경으로 사용되는 부수거나 옮길 수 없는 벽이 있다면, 리지드바디 컴포넌트를 넣지 않고 그냥 사용한다. 이렇게 해도 상호작용이 가능하다.


리지드바디는 GameObjects가 물리적 영향력 하에 동작하게 하여 준다

속성

질량 Mass 킬로그램으로 표시된 오브젝트의 무게. 다른 리지드바디에 비교하여 100배 이하 혹은 이상 이내에서 무게를 정할 것을 권유함.
항력 Drag 힘을 받아 동작할 때 오브젝트에 가해지는 공기 저항력의 정도. 0은 저항력이 없는 상태를 말하고, 무한대면 오브젝트는 즉시 멈춰서 버립니다.
각항력 Angular Drag 회전력에 의해 회전 시 오브젝트에 가해지는 공기 저항력의 정도. 0은 저항력이 없는 상태를 말하고, 무한대면 오브젝트는 즉시 멈춰서 버립니다.
중력 사용 Use Gravity 이 속성이 켜지면, 오브젝트는 중력의 영향을 받는다.
Is Kinematic 이 속성이 켜지면, 오브젝트는 물리 엔진에 의해 작동하지 않고, 그의 Transform에 의해서만 조종될 수 있다. 이 속성은 움직이는 플랫폼에서 유용하며 또한 사용자가 HingeJoint가 있는 리지드바디를 동영상화 하고 싶을 때도 유용함.
보간 Interpolate 만일 사용자의 리지드바디 움직임에 경련이 보이면 이 중 한 옵션을 사용하여 보십시오.
»>None 보간법(Interpolation)이 적용되지 않는다.
»>Interpolate 이전 프레임의 Transform을 기반으로 Transform을 부드럽게 수행함.
»>Extrapolate 다음 프레임의 Transform을 예상하여 Transform을 부드럽게 수행함.
충돌 검사 Collision Detection 오브젝트가 충돌을 감지하지 못하고 다른 오브젝트를 관통하는 것을 방지하기 위하여 사용된다.
»>Discrete 장면(scene) 내에서 다른 모든 콜라이더에 대한 신중한(Discreet) 충돌 감지를 사용함. 다른 콜라이더는 이것에 대한 충돌을 시험할 때 Discrete 충돌 감지를 사용할 것 이다. 일반 충돌에 사용 된다.(이것은 디폴트 값이다).
»>Continuous 동적 콜라이더에 (리지드바디를 가지고 있는) 대해서는 신중한(Discrete) 충돌 감지를 사용하고, 정적 메쉬콜라이더(static MeshColliders) (리지드바디가 없음)에 대해서는 지속적인 충돌감지를 사용함. 지속적인 동적(Continuous Dynamic)으로 설정된 리지드바디는 이 리지드바디에 대한 충돌을 테스트 할 때 지속적 충돌 감지를 사용할 것 이다. 다른 리지드바디는 신중한 충돌(Discreet Collision) 감지를 사용할 것 이다. 지속적인 동적(Continuous Dynamic) 리즈드바디가 충돌할 필요가 있는 오브젝트에 사용된다. (이것은 물리적 수행에 있어 커다란 임팩트가 있으므로, 빠른 오브젝트의 충돌에 별 문제가 없다면 Discrete로 남겨두기 바란다).
»>Continuous Dynamic 속성이 Continuous로 설정된 오브젝트나 지속적 동적 충돌(Continuous Dynamic Collision)에는 지속적 충돌 감지를 사용함. 이것 또한 (리지드바디가 없는)정적 메쉬콜라이더(static MeshColliders)에 대하여 지속적 충돌 감지를 사용할 것 이다. 다른 콜라이더에 대해서는 신중한(discrete) 충돌 감지를 사용함. 빠르게 움직이는 오브젝트에 사용된다.
Constraints
위치 고정 »>Freeze Position월드에서 움직이는 리지드바디를 . X, Y, Z축에서 선택적으로 멈추게 함.
회전 고정 »>Freeze Rotation월드에서 회전하는 리지드바디를 . X, Y, Z축에서 선택적으로 멈추게 함.

상세사항

리지드바디는 사용자의 GameObjects가 물리엔진의 제어 내에서 동작할 수 있게 함. 이것은 실감나는 충돌, 여러 종류의 조인트들, 그리고 여타의 아주 멋진 동작을 가능하게 함. 사용자의 GameObjects에 리지드바디에 힘을 가하여 조종하게 되면 단순한 Transform Component보다는 아주 다른 느낌과 시각의 효과를 줄 수 있다. 일반적으로 사용자는 같은 GameObject에서 물리력을 적용하여 리지드바디를 조종하는 것과 값을 직접 변경하는 변형(Transform)을 동시에 같이 할 수는 없고 하나를 선택해야 함.

변형(Transform)과 리지드바디를 조종하는 것 사이의 가장 큰 차이는 힘의 사용이다. 리지드바디는 힘과 회전력을 받을 수 있지만, 변형(Transform)은 없다. 변형(Transform)도 해석하고 회전할 수 있지만 물리력을 사용하는 것과 같은 것은 아니다. 사용자가 직접 사용해보면 극명한 차이를 느낄 것 이다. 리지드바디에 힘과 회전력을 가하면 실제로 오브젝트의 Transform 컴포넌트의 위치와 회전을 변경함. 이렇기 때문에 사용자는 둘 중 하나만을 사용해야 함. 물리력을 사용하면서도 Transform을 변경하는 것은 충돌과 여타 다른 계산에서 문제를 일으킬 수 있다.

리지드바디가 물리엔진에 의해 영향을 받으려면 명시적으로 사용자의 GameObject에 추가하여야만 함. 사용자는 메뉴바에서 Components→Physics→Rigidbody에서 선택한 오브젝트에 리지드바디를 추가할 수 있다. 이제 사용자의 오브젝트는 물리적으로 완벽함. 해당 오브젝트는 중력하에서 추락하고 스크립트를 통해 힘을 받을 수 있으나, 만일 사용자가 원하는 대로 정확하게 행동하게 하려면Collider난 조인트(Joint)를 추가해야 할 수도 있다.

Parenting

어느 오브젝트가 물리력 제어 하에 있을 때, 이의 변형부모(transform parents )가 움직이는 것과 반쯤 독립적으로 움직이다. 사용자가 어느 한 부모를 이동시키면, 부모는 리지드바디 자식을 같이 끌고 다닙니다. 하지만 해당 리지드바디는 여전히 중력에 추락하고 충돌 이벤트에 반응함.

Scripting

사용자의 리지드바디를 제어하기 위하여, 사용자는 주로 스크립트를 사용하여 힘이나 회전력을 가할 것 이다. 이것을 하려면 오브젝트의 리지드바디에 AddForce()AddTorque()를 호출함.사용자가 물리력을 사용할 경우 오브젝트의 Transform을 변경할 수 없다는 것을 기억하십시오.

Animation

어떤 상황에서는, 주로 랙돌(ragdoll) 효과 생성에, 애니메이션과 물리력 사이에 오브젝트의 제어를 맞교환 할 필요가 있다. 이러한 목적을 위하여 리지드바디는 isKinematic으로 표시될 수 있다. 리지드바디가 isKinematic으로 표시되어 있는 한 충돌, 힘 혹은 여타 다른 부분의 physX에 대한 영향은 미치지 못함. 이 경우 사용자는 Transform 콤포넌트를 바로 조종하여 해당 오브젝트를 제어해야 한다는 것을 의미함. 운동학적 리지드바디(Kinematic Rigidbodies)는 다른 오브젝트에 영향을 주겠지만 그 들 자신은 물리력에 영향을 받지 않는다. 예를 들어, Kinematic 오브젝트에 부착된 조인트는 다른 리지드바디가 부착되는 것을 제한하고, 운동학적 리지드바디는 충돌을 통해 다른 리지드바디에 영향을 줄 것 이다.

Colliders

콜라이더는 리지드바디와 함께 충돌이 발생을 가능케 하려면 추가되어야 하는 다른 종류의 콤포넌트이다. 만일 2개의 리지드바디가 서로 충돌하면, 물리엔진은 두 오브젝트에 콜라이더가 부착되어 있지 않는 한 계산을 하지 않을 것 이다. 콜라이더가 없는 리지드바디는 물리력 시뮬레이션에서 서로를 관통하고 지나갈 뿐이다.


콜라이더는 리지드바디의 물리적 경계를 정의함

메뉴의Component→Physics에서 콜라더를 추가함. 각 콜라이의 콤포넌트 조회 페이지에서 더 많은 메뉴를 확인할 수 있다:

  • Box Collider - 정육면체의 프리미티브 모양
  • Sphere Collider - 구의 프리미티브 모양
  • Capsule Collider - 캡슐의 프리미티브 모양
  • Mesh Collider - Collider 오브젝트의 메쉬에서 콜라이더를 생성, 다른 메쉬 콜라이더와 충돌 할 수 없다
  • Wheel Collider - 자동차와 여타 움직이는 교통수단을 위한 콜라이더

복합 콜라이더

복합 충돌체(Compound Colliders)는 기본(primitive) 충돌체의 조합으로, 합쳐서 하나의 단독 충돌체로써 동작합니다. 이는 사용자가 충돌에서 복잡한 메쉬(mesh)를 사용하고 싶으나 Mesh Collider을 사용할 수 없을 때 유용합니다. 복합 충돌체를 생성하려면, 사용자의 충돌하는 오브젝트에 자식(child) 오브젝트를 생성하고, 그리고 각 자식 오브젝트에 기본 충돌체를 추가합니다. 이렇게 하면 각 충돌체를 다른 것과 독립하여 위치, 회전 및 확장할 수 있습니다.


현실 세계의 복합 충돌체(Compound Collider) 설치

위 그림에서, 환경에 메쉬 충돌체(Mesh Collider)가 부착되어 있습니다. 메쉬 충돌체는 지형(terrain)이나 불규칙적인 모양으로 된 주변환경 메쉬에 최적입니다. gun_model 게임오브젝트(GameObject)에는 리지드바디(Rigidbody)와 여러 기본 충돌체가 게임오브젝트의 자식으로 부착되어 있습니다. 이 기본 충돌체는 환경의 메쉬 충돌체와 충돌하고, 부모 리지드바디는 여기에 적용된 힘과 자식 충돌체가 다른 충돌체와 씬(Scene)에서 상호작용하는 방법을 바탕으로 이들이 움직이는 방식을 변경합니다.

메쉬 충돌체(Mesh Colliders)는 일반적으로 서로 충돌하지 않습니다. 만일 메쉬 충돌체가 Convex로 표시되어 있다면, 그러면 이는 다른 메쉬 충돌체와 충돌합니다. 일반적인 해결책은 움직이는 모든 오브젝트에 대한 기본 충돌체를 사용하고, 정적이 배경 오브젝트에는 메쉬 충돌체를 사용합니다.

지속적인 충돌 감지

지속적 충돌감지(Continuous collision detection is)는 빨리 움직이는 콜라이더가 서로를 관통하는 것을 방지할 수 있다. 노멀(Discrete) 충돌 감지를 사용하거나, 한 오브젝트가 한 프레임 내에서 콜라이더의 한쪽 면에 있고 다음 프레임에서 이미 해당 콜라이더를 지나쳤을 때 이 현상이 발생할 수 있다. 이것을 해결하기 위하여, 사용자는 빨리 움직이는 오브젝트의 리지드바디 상에 지속적 충돌감지(continuous collision detection) 옵션을 켤 수 있다. 리지드바디가 충돌감지 모드가 Continuous 혹은 Continuous Dynamic으로 설정된 여타의 다른 리지드바디를 서로 관통하는 것을 방지하려면 충돌 감지 모드를 Continuous 로 설정하여야 함.

정확한 크기의 사용

사용자의 GameObject의 메쉬의 크기는 리지드바디의 질량보다 훨씬 더 중요함. 만일 사용자의 리지드바디가 예상한 대로 움직여주지 않으면 – 느리거나 떠다니거나 혹은 정확하게 충돌하지 않으면 – 사용자 에셋의 질량을 조정해 보십시오. 유니티의 디폴트 단위 크기는 1 단위 = 1 미터로 하여 사용자가 들여온 메쉬의 크기가 유지되고 물리력계산에도 적용된다. 예를 들어, 무너지는 고층빌딩은 장난감 블록으로 만든 타워와는 아무 다르게 동작하므로, 규모가 다른 오브젝트는 정확한 규모로 모델링이 되어야 함.

사용자가 만일 인간을 모델링 한다면, 유니티에서 2미터 가량 되도록 해야 함. 사용자 오브젝트가 정확한 크기를 가지고 있는지 확인하려면, 디폴트 규브와 비교하여 보십시오. 사용자가 큐브를 생성하려면 GameObject→Create Other→Cube를 사용하면 된다. 해당 큐브의 높이는 정확하게 1미터가 될 것이므로, 사용자은 인간 오브젝트는 2배쯤이 되어야 함.

사용자가 메쉬 그 자체를 조절할 수 없다면, 사용자는 Project View 에서 Assets→Import Settings…을 선택하여 특정 메쉬 에셋의 동일 스케일을 변경 할 수 있다. 여기서, 사용자는 스케일을 변경하고 사용자 메쉬를 다시 불러들이기 할 수 있다.

사용자의 게임이 사용자 오브젝트를 다른 규모로 발생하게 할 필요가 있다면, 사용자 Transform의 스케일 축의 값을 조절하는 것은 허용된다. 단점은 물리 시뮬레이션에서 해당 오브젝트가 발생할 때 더 많은 작업을 해야 한다는 것이며 이것이 사용자 게임의 성능 저하를 가져올 수 있다. 이것이 비로 엄청난 손실은 아니지만 다른 두 옵션으로 사용자의 스케일을 최종 설정하는 것보다는 덜 효율적이다. 또한 일정하지 않은 스케일을 사용하면 육아(Parenting)이 사용되었을 때 원치 않는 행동이 생길 수도 있다는 것을 기억하십시오. 이러한 이유들로 사용자의 모델링 어플리케이션에서 정확한 스케일을 사용하여 오브젝트를 생성하는 것이 항상 최고의 선택이라는 것 이다.

메소드

  • AddExplosionForce Applies a force to a rigidbody that simulates explosion effects.
  • AddForce Adds a force to the Rigidbody.
  • AddForceAtPosition Applies force at position. As a result this will apply a torque and force on the object.
  • AddRelativeForce Adds a force to the rigidbody relative to its coordinate system.
  • AddRelativeTorque Adds a torque to the rigidbody relative to its coordinate system.
  • AddTorque Adds a torque to the rigidbody.
  • ClosestPointOnBounds The closest point to the bounding box of the attached colliders.
  • GetPointVelocity The velocity of the rigidbody at the point worldPoint in global space.
  • GetRelativePointVelocity The velocity relative to the rigidbody at the point relativePoint.
  • IsSleeping Is the rigidbody sleeping?
  • MovePosition Moves the kinematic Rigidbody towards position.
  • MoveRotation Rotates the rigidbody to rotation.
  • ResetCenterOfMass Reset the center of mass of the rigidbody.
  • ResetInertiaTensor Reset the inertia tensor value and rotation.
  • SetDensity Sets the mass based on the attached colliders assuming a constant density.
  • Sleep Forces a rigidbody to sleep at least one frame.
  • SweepTest Tests if a rigidbody would collide with anything, if it was moved through the Scene.
  • SweepTestAll Like Rigidbody.SweepTest, but returns all hits.
  • WakeUp Forces a rigidbody to wake up.

Hints

  • 두 리지드바디의 상대적 Mass가 그들이 서로 충돌했을 때 어떻게 반응하는 지를 결정함.
  • 한 리지드바디를 다른 것보다 Mass를 크게 한다고 해서 다른 것보다 빨리 자유 낙하하는 것은 아니다. Drag를 사용하십시오.
  • 낮은 Drag 값을 설정하면 해당 오브젝트가 무거워 보이게 함. 높은 값은 가벼워 보이게 함. Drag의 전형적인 값은 .001(단단한 강철 블록)과 10(새털)의 사이에서 결정함.
  • 사용자가 사용자 오브젝트를 Transform 콤포넌트에서 직접 조정하면서 물리력을 원한다면, 리지드바디를 하나 추가하고 그것을 Kinematic으로 설정하십시오.
  • 사용자가 Transform 콤포넌트를 사용하여 GameObject를 움직이고 있으나 Collision/Trigger 메시지를 수신하고 싶다면, 사용자는 움직이는 오브젝트에 리지드바디를 부착하여야 함.

역링크