NVIDIA Omniverse 물리 시뮬레이션 및 PhysX 설정 가이드2 - SmartX-Team/Omniverse GitHub Wiki
기본 용어 목록
강체(Rigid Bodies) 와 충돌체(Colliders) 는 장면(Scene)에 물리적 효과를 추가하는 데 사용되는 기본 구성 요소 들이다.
장면의 지오메트리에 강체 동역학을 추가하여 중력에 의해 가속되고 다른 물리적 객체(변형 가능한 물체나 유체 포함)와 충돌할 수 있도록 설정할 수 있다. 또한, 장면 지오메트리에 충돌을 추가하여 기본적인 바닥 평면과 같은 정적 물리 객체를 생성할 수 있다.
강체(Rigid Body)는 물리적 시뮬레이션에서 고정된 모양과 부피를 가지며, 변형되지 않는 물체를 나타낸다. Omniverse에서 강체는 물리적 상호작용, 충돌 및 힘을 정확하게 시뮬레이션할 수 있도록 다양한 설정과 속성을 제공한다.
정적 충돌체 와 일반 충돌체의 차이는 강체(Rigid Body) 차이로 결정된다. 각각의 사용처는 아래와 같다.
정적 충돌체 (Static Collider) 는 움직이지 않지만 다른 물리 객체와 충돌할 수 있는 충돌 영역으로, 주로 바닥이나 벽과 같은 고정된 구조물에 사용된다.
일반 충돌체 (Collider) 는 움직이는 강체에 충돌 영역을 설정하여 다른 물리 객체와 상호작용하며, 물체의 모양과 동적 특성을 바탕으로 충돌을 처리한다.
변환(Transform)을 가진 모든 Prim은 강체로 만들 수 있다(즉, 모든 USD Xformable-파생 Prim). 예를 들어, Cube나 Sphere와 같은 기하학적 형태나 Mesh Prim 들에 강체 및 충돌체 설정을 추가하여 시뮬레이션을 진행할 수 있다.
해당 예제에서는 정적 충돌체로 설정된 Ground 와 Rigid Body 와 Collider 을 적용한 Cube Prim 의 시뮬레이션 동작을 보여준다.
Ground 에 Rigid Body Property를 추가해서 일반 충돌체로 변환했을때의 시뮬레이션 동작이다. Ground 역시 중력 영향을 받는걸 확인 할 수 있다.
Ground 에서 Collider 설정까지 제거했을때의 시뮬레이션 동작이다. Cube Prim이 Ground와 상호작용 없이 가라 앉는걸 확인할 수 있다.
*Rigid Body 설정에서 중력의 영향 설정을 제거하면 Static Collider 처럼 사용할 수 있다라고 생각할 수 있다. 하지만 Rigid Body 로 설정하면 기본적으로 연산량이 많아진다. 만약 벽이나 바닥을 전부 Rigid Body 로 적용하면 물리 엔진은 Rigid Body들에 대해 물리적 힘, 충돌, 동역학 등을 고려하여 동적 상호작용과 물리적 특성을 계속해서 계산하기 때문에, 벽이나 바닥과 같은 고정된 구조물에도 Rigid Body 설정을 적용하면 시뮬레이션 상 리소스를 비효율적으로 사용하게 된다.
Omniverse 상 강체 적용 방법
뷰포트나 스테이지 트리에서 해당 Prim을 마우스 오른쪽 버튼으로 클릭하거나, Prim의 속성 창(Property Window)에서 Add 버튼을 사용하고, Add > Physics > Rigid Body with Colliders Preset을 선택합니다.
이 프리셋 버튼을 사용하면 기본적인 Rigid Body 와 Colliders 설정이 적용된다.
강체 구성 요소 (Rigid Body Component):
속성 별
- Rigid Body Enabled: 이 체크박스를 선택하면 물체에 강체 속성이 적용된다.
- Kinematic Enabled: 물체를 운동학적으로 설정하여 외부 힘에 의해 영향을 받지 않지만, 프로그래밍적으로 제어할 수 있다. (뒤에서 후술)
- Simulation Owner: 현재 시뮬레이션 소유자와 연결된 물체의 타겟을 지정할 수 있다.
- Starts as Asleep: 시뮬레이션 시작 시 물체를 잠든 상태로 설정하여 움직임을 제한한다.
- Velocities in Local Space: 속도가 로컬 좌표계에서 정의되도록 설정한다.
- Linear Velocity: 물체의 초기 선형 속도를 설정 (X, Y, Z 축별).
- Angular Velocity: 물체의 초기 회전 속도를 설정 (X, Y, Z 축별).
- Linear Damping: 선형 속도 감소율을 설정하여 물체가 천천히 멈추도록 한다.
- Angular Damping: 회전 속도 감소율을 설정하여 물체의 회전을 천천히 멈추도록 한다.
- Max Linear Velocity: 물체가 가질 수 있는 최대 선형 속도를 설정한다.
- Max Angular Velocity: 물체가 가질 수 있는 최대 회전 속도를 설정한다.
- Sleep Threshold: 물체가 일정 시간 동안 활동이 없을 때 시뮬레이션을 멈추는 임계값을 설정한다.
- Enable CCD: 연속 충돌 감지를 활성화하여 빠르게 이동하는 물체의 충돌을 정확하게 계산한다.
- Disable Gravity: 중력의 영향을 비활성화하여 물체가 중력에 반응하지 않도록 설정한다.
- Locked Pos Axis: 특정 축(X, Y, Z)에서의 위치 이동을 잠근다.
- Locked Rot Axis: 특정 축(X, Y, Z)에서의 회전을 잠근다.
충돌 구성 요소 (Collision Component):
- Collision Enabled: 충돌 감지를 활성화합니다. 이 옵션이 선택되면 물체가 다른 물체와의 충돌을 감지하고, 물리적 상호작용이 발생한다.
- Simulation Owner: 현재 충돌체의 시뮬레이션을 담당하는 소유자를 지정합니다. 이 필드는 대상이 여러 물리 엔진이나 시뮬레이션 시스템과 연동되는 경우에 사용된다.
- Add Target(s): 충돌체의 물리적 상호작용을 조정할 추가 타겟을 지정할 수 있다. 특정 물체나 요소와의 충돌 처리를 위한 타겟을 설정할 때 사용된다.
- Approximation:
-
- Convex Hull: 물체의 가장 바깥쪽 꼭짓점을 연결하여 생성된 볼록 다면체이다. 복잡한 형태의 물체에 사용되어 비교적 간단한 계산으로 충돌을 처리한다.
-
- Triangle Mesh: 물체의 표면을 삼각형 메쉬로 표현하는 방식이다. 높은 정확도를 제공하지만 계산 비용이 높아진다.
-
- Convex Decomposition: 복잡한 형태의 물체를 여러 개의 볼록 다면체로 분해하여 충돌 감지를 처리한다. 정확도와 계산 비용의 균형을 맞추는 방식이다.
-
- Bounding Sphere: 물체를 둘러싸는 구체로, 충돌 감지를 매우 단순하게 처리한다.
-
- Bounding Cube: 물체를 둘러싸는 큐브로, 충돌 감지를 단순하게 처리한다.
-
- Mesh Simplification: 메쉬를 단순화하여 충돌 감지의 계산 비용을 줄인다.
-
- SDF Mesh: SDF(서명 거리 함수)를 사용하여 물체의 형태를 기반으로 충돌 감지를 처리한다. 복잡한 형태의 물체에 적합하다.
- Hull Vertex Limit: 볼록 다면체(Convex Hull)에서 사용할 최대 꼭짓점의 수를 설정한다. 해당 값 설정으로 충돌체의 세밀함과 계산 비용에 영향을 결정할 수 있다.
충돌 모양을 정의하여 물체가 스테이지의 다른 충돌 가능 객체(예: 바닥 평면 또는 변형 가능한 물체)와 어떻게 충돌하는지 결정합니다. 관련 속성을 제공합니다.
Compound-Shape Rigid Bodies 는 여러 하위 요소로 구성된 Mesh 들을 함께 움직이도록 설정하는 기능입니다.
Kinematic Rigid Bodies 는 뮬레이션 객체는 정적 충돌체와 유사하다. 즉 UI, 스크립트등, 애니메이션을 통해 직접 변경하지 않는 한 물리 엔진을 통해 움직이지 않는다. 하지만 시뮬레이션 과정중 물체의 속도 계산은 동일하게 지원된다.
Kinematic Body가 사용되 예시
-
경로를 따라 움직이는 물체 물체가 특정 애니메이션을 따라 움직일 때, 물리적 상호작용을 배제하고 프로그래밍된 경로로 이동하도록 설정하는 경우 예시: 엘레베이터나 에스컬레이터가 정해진 속도와 경로로 움직이는 상황을 구현해야하는 상황이라면 엘레베이터에 Kinematic Body 설정을 적용하여 물리적 힘의 영향을 받지 않고 정해진 위치에서만 움직이도록 한다. 이때 엘레베이터에 사람이나 사물이 탑승할 경우 엘레베이터는 다른 Object 들과의 물리적 상호작용으로 움직이지는 않지만 상호작용과정에서 생성된 물리량등 관련 데이터를 생성하여 제공한다.
-
사용자 입력에 따른 제어 사용자의 입력에 따라 물체를 직접적으로 제어해야 하는 경우 예시: 가상 세계에서 플레이어가 직접 제어하는 캐릭터나 차량을 움직이는 경우 플레이어 캐릭터에 Kinematic Body 설정을 적용하여 키보드나 컨트롤러 입력에 따라 움직이게 한다.
(Kinematic Body는 물리적 상호작용을 통한 움직임은 제한하면서 상호작용 데이터를 얻을 수 있다. )
그 외 Rigid Body 설정과 관련된 자세한 내용은 Nividia 공식 페이지를 참조하세요 https://docs.omniverse.nvidia.com/extensions/latest/ext_physics/rigid-bodies.html#collisionsettings
다음 장에서는 실제 파이썬 스크립트 기반으로 Rigid Body들을 설정하고 실제 NetAI DT에서 사용한 사례들 위주로 정리합니다.