posted by 나무꾼! 2014. 12. 12. 11:09

Havok Rigid Body 컴포넌트 속성

하복 물리 엔진은 어떤 게임 엔진에서도 사용이 가능한 범용 미들웨어 이지만 Havok Vision 엔진 에서는 같은 회사의 제품인 만큼 좀 더 쉽게 물리 엔진을 사용할 수 있도록 기본적으로 통합이 되어 있다. 예를 들어 vForge 툴에서 '하복 강체(이하, Havok Rigid body)' 컴포넌트를 임의의 엔티티Entity에 추가하기만 하면 쉽게 물리적인 속성을 부여할 수 있다. 이번 절에서는 Havok Rigid body 컴포넌트 에서 조절할 수 있는 대표적인 속성들에 대해 알아 보겠다. 샘플 예제를 이용해서 vForge 에서 직접 플레이 해보면서 속성을 조절해 보면 쉽게 이해할 수 있을 것이다.

샘플 다운로드 : https://github.com/taru00/AnarchyTutorial

샘플 Scene파일 위치 : ForgeSamples/HavokPhysicsIntegration/Scenes/HavokRigidBodyComponent.scene

1. 탄성Restitution

강체가 충돌한 후 힘을 잃는 정도를 조절하기 위한 속성이다. '0 ~ 1.98' 사이의 값을 입력할 수 있으며 크기가 클수록 물체가 튕기는 정도인 탄성이 크다.

그림. 서로 다른 탄성값을 적용한 예제

2. 마찰력Friction

강체와 맞닿은 표면이 미끄러지는 정도를 조절하기 위한 속성 이다. 0 ~ 1 사이의 값을 입력할 수 있으며 크기가 작을수록 물체가 더 쉽게 미끄러지게 된다.

3. 모션 타입Motion Type

Motion Type 에 따라 물체 와 물체 사이의 상호작용을 조절할 수 있고 게임 환경을 쉽게 구성하기 위해 현실세계에 존재하지 않는 가상의 강체를 만들어 낼 수도 있다

Ÿ Dynamic : 우리가 흔히 현실 세계에서 볼 수 있는 물체의 운동 방식이다.

Ÿ Keyframed : 움직이면서 다른 강체에 영향을 줄 수 있지만 그 반대로 다른 강체로부터 영향을 받지는 않는 질량이 무한대인 가상의 강체 이다

Ÿ Fixed : 어떤 충격에도 절대로 움직이지 않는 질량이 무한대인 가상의 강체 이다. Keyframed 와 유사하게 다른 강체에 영향을 주지만 영향을 받지는 않는다.

Ÿ Character : 바닥 위를 걸어 다니면서 다른 강체 에 영향을 줄 수 있는 캐릭터의 움직임을 표현하기 위한 특별한 타입이다.

4. 댐핑 Damping

운동에 대한 저항값을 의미한다. 댐핑값을 크게 지정하면 빠르게 힘을 잃어버리면서 정지 상태가 된다. 선형 댐핑Linear Damping 을 통해 이동 성분에 대한 저항값을 지정할 수 있고, 회전 댐핑Angular Damping을 통해서는 회전운동에 대한 저항값을 지정할 수 있다. 입력 가능한 범위는 0 ~ 1 사이의 값이다.

그림. 선형 댐핑Linear Damping

그림. 회전 댐핑Angular Damping

5. 관성 텐서Inertia Tensor

관성 텐서Inertia Tensor 는 강체가 외부의 힘에 의해 운동의 회전 성분이 발생되는 정도에 대한 저항값을 조절하기 위해 사용 된다. 예를 들어 관성 텐서Inertia Tensor의 스케일Scale 값이 작은 강체는 충돌시 회전 운동이 더 많이 발생 되기 때문에 가벼운 느낌이 들게 되고, 관성 텐서Inertia Tensor의 스케일Scale 값을 크게 지정 하면 충돌시 회전 운동이 거의 발생되지 않기 때문에 좀 더 묵직한 느낌이 들게 된다. 입력 가능한 값은 0.001 ~ 1000 사이의 값이다. 모양이 길쭉하거나 넓적한 강체의 운동을 표현하기 위해 회전 축마다 다른 관성 텐서Inertia Tensor 값을 지정할 수도 있다.

6. 질량 중심COM

강체의 운동을 질량 중심을 기준으로 관찰하면 복잡한 운동의 변화를 질량 중심에서의 운동만으로 단순화 하는 것이 가능하다.

질량 중심의 위치에 따라 외부의 힘에 의한 강체의 반응 또한 달라지게 되는데 물리 엔진 에서는 강체의 질량 중심을 원하는 위치로 설정하는 것이 가능 하다. 예를 들어 레이싱 게임에서 차량의 질량 중심을 바닥 밑으로 낮게 설정하면 차가 급회전을 할 때 차가 기울면서 전복되는 정도가 감소되기 때문에 좀 더 안정적인 코너링을 표현 할 수 있다. 대신 정면 추돌시 발생되는 회전 성분은 더 크게 되기 때문에 상황에 따라 적절한 위치에 질량 중심을 설정하는 것이 중요하다.

그림. [출처 : Havok Physics 매뉴얼]

7. 충돌 그룹Collision Group

강체들 사이의 충돌이 일어나지 않도록 인위적으로 설정하기 위한 기능이다. 최적화나 물리 상태의 안정화를 위해 주로 활용 된다. 대표적인 활용 사례를 예를 들면, 캐릭터가 물리적으로 쓰러지도록 하기 위해서 물리 랙돌Ragdoll 을 활성화 하는 순간 캐릭터를 감싸고 있는 캐릭터 컨트롤러Character Controller 의 캡슐과 랙돌의 충돌로 인해 캐릭터가 의도치 않게 밖으로 내던져지는 현상을 방지하기 위해 랙돌과 캐릭터 컨트롤러는 충돌이 발생되지 않도록 충돌 레이어 에서 설정이 되어 있는데 이와 유사한 같은 충돌 그룹Collision Group 으로 설정하는 경우가 있다. 캐릭터 컨트롤러 와 랙돌에 대해서는 다음 절에서 자세히 설명하도록 하겠다.

 

8. 퀄리티 타입Quality Type 

강체의 충돌처리를 위해 얼마나 높은 정밀도를 가진 연산방법을 사용할지를 설정할 수 있다.

성능 저하를 감수하더라도 빠르게 이동하는 작은 강체의 충돌 처리를 보장하기 위해 연속적인 물리를 적용해야 하는 경우 퀄리티 타입Quality Type을 Bullet 으로 지정할 수 있다. 기본값인 Auto 로 설정 할 경우 모션 타입Motion Type 에 따라 퀄리티 타입Quality Type은 자동으로 지정 된다.

9. 물리적인 형태의 종류Shape Type

물리적인 형태를 임의의 타입으로 변경하거나 크기를 조절할 수 있다. 물리 형태만 지정하고 관련 설정 값은 지정하지 않을 경우 자동적으로 적합한 크기로 조절이 된다. 물리 형태에 따라 성능 이나 품질의 차이가 있기 때문에 적합한 물리 형태로 지정하는 것이 매우 중요하다. 각각의 형태에 따른 특징은 다음과 같다.

  • Sphere : Radius 값으로 구의 크기를 조절할 수 있다. 충돌 처리에 가장 효율적인 물리 형태로 물리 엔진 내부에서는 구의 중심 좌표와 반경 값 만으로 구성 된다.
  • Box : 단순한 직육면체 형태로서 X ,Y , Z 값을 통해 지정할 수 있다. 물리 엔진 내부에서는 박스의 중심 좌표와 박스를 구성하는 가로, 세로, 높이 값으로 구성 된다.
  • Capsule : Radius 와 Height 값으로 설정이 가능하다. 두 개의 구와 한 개의 실린더를 합친듯한 모양으로, 두 개의 구의 중심 좌표와 반지름으로 표현된다. 반지름 값이 Convex Radius 값으로 바로 활용되므로 충돌 판정에 매우 효율적인 형태 중 하나이다
  • Cylinder : Radius 와 Height 값으로 설정이 가능하다. 물리 엔진 내부에서는 실린더의 시작 위치와 끝 위치를 나타내는 두 개의 좌표 값, 그리고 실린더의 반지름 값으로 구성 된다. 효율적인 충돌처리를 위해 별도의 Convex Radius값이 사용된다.
  • Convex Hull : 움푹 파인 부분이 없이 대상을 완전히 감싸는 형태이다. 복잡한 형태를 가진 Mesh 를 거의 유사한 형태로 표현하면서도 가볍고 빠르게 충돌 처리가 가능하기 때문에 유용하게 사용된다. 여러 개의 정점들이 집합체로 구성이 되며 물리 엔진 내부에서 최적의 Convex Hull 을 자동으로 생성하는 기능을 제공 하고 있다. 좀 더 세밀한 Convex Hull 생성 옵션을 지정하고 싶을 경우 3dsMax나 Maya에서 Convex Hull 을 생성해서 익스포트가 가능하고 Shape Type을 Convex Hull 대신 File 로 지정하면 사용이 가능하다.
  • Mesh : 여러 개의 Convex 가 합쳐진 형태로 Static Mesh 타입의 복잡한 지형을 정밀하게 표현하기 위해 사용되기도 한다. 하지만 최적화를 위해 가능하면 좀 더 단순한 물리 형태를 사용하는 것을 권장 한다.
  • File : Shape type이 File로 지정되었을 경우 별도의 파일로부터 좀 더 세부적인 설정을 가져올 수 있다. 해당 파일은 3dsMax나 Maya에서 Havok Contents Tool 을 통해 내보낼 수 있다.

    • FileResourceName : shape type 만을 지정된 파일에서 가져온다
    • All Rb Data From File : 세부적인 Rigid Body 설정 정보를 지정된 파일에서 가져온다.

10. 웰딩 타입Welding Type

웰딩은 이웃하는 폴리곤으로 강체의 접촉점Contact Point 이 전환되면서 강체가 튕기는 현상을 방지하기 위한 기법이다. WeldingType은 Static Mesh의 속성 패널에서 설정할 수 있으며, 보통은 Anti-Clockwise 를 주로 사용한다. 웰딩을 적용하면 강체와 접촉하는 바닥면의 폴리곤 경계 사이 또는 면의 모서리에서 강체의 움직임이 부자연스러운 문제를 방지할 수 있다. 웰딩 알고리즘이 폴리곤을 이루는 정점의 순서에 의존하기 때문에 3dsMax나 Maya에서 폴리곤의 와인딩Winding 이 일정하지 않거나 잘못된 채 (폴리곤의 정점 인덱싱 순서가 일정하지 않아서 법선 벡터가 반대방향이 된 경우) 익스포트 되었다면 웰딩이 정상적으로 동작하지 않기 때문에 주의가 필요하다.

그림. Welding Type 을 None으로 지정했을 때 발생되는 현상