제약 시스템 Constraint System
강체를 Constraint로 연결하는 것은 C++ 코드를 통해서 구현하거나 3dsMax 에서 Havok Contents Tool 플러그인을 통해서도 설정이 가능하지만 여기서는 가장 쉬운 방법으로 vForge 에디터 에서 설정하는 방법을 설명하도록 하겠다.
Note : 하복에서 제공하는 제약 조건들은 공통적으로 제약조건의 개수에 비례하게 일정하게 성능 부하가 증가된다. 예를 들어 100개의 제약 조건을 사용할 경우 10개의 제약 조건을 사용했을 때 보다 약 10배의 시간이 더 소요가 되게 된다. 그리고 일반적으로 한 제약조건 안에서 더 많은 자유도를 제약할수록 성능 부하가 더 증가하게 된다.
1. vForge 에서 Constraint 연결하기
vForge 에서는 Havok Rigid Body 컴포넌트를 가진 엔티티를 제약 조건으로 쉽게 연결 할 수 있다. 간단한 Constraint 를 연결하는 과정은 다음과 같다. 만약 Constraint 의 종류가 다르더라도 기본적인 설정 과정은 동일하고 Constraint Type 만 변경하면 원하는 타입의 Constraint로 설정이 가능하다.
- 장면에 한 개의 Constraint 와 두 개의 Anchor 를 추가 한다. 여기서 적어도 한 개의 Anchor 는 Havok Rigid Body 컴포넌트를 가지고 있는 Entity 의 자식으로 추가되어야 한다.
- 링크모드를 통해 Constraint 를 Anchor 에 연결 한다
- 연결 부위가 떨어지지 않도록 Anchor 와 Constraint 의 위치가 일치 되도록 설정 해야한다
- Align to parent 기능을 이용하면 쉽게 위치를 정렬할 수 있다
- 정렬을 위해 임시로 자식 노드로 설정했던 Anchor 와 Constraint 를 다시 원위치 한다.
2. Constraints 들의 공통적인 속성
Constraint의 종류에 관계 없이 Breakable 및 Malleable 설정은 모든 동일한 속성을 가진다
Breakable Settings:
- Is Breakable: 이 속성을 True로 설정하면, Threshold 이상의 힘에 의해 제약 조건과 강체의 연결이 깨지도록 설정 할 수 있다
- Threshold: Is Breakable 속성이 True 인 경우, Threshold 이상의 힘에 의해 제약 조건과 강체 와의 연결이 깨지면서 강체가 제약조건으로부터 자유로워 진다. 이 속성에 대한 범위는 0과 무한대 사이이다.
- Revert Velocity On Break: Is Breakable 속성이 True 인 경우, 이 속성을 통해 제약조건과 강체와의 연결이 깨질 때 영향 받는 강체의 속도가 초기화 되도록 설정할 수 있다. 기본값은 True 이다
Malleable Settings:
- Is Malleable: 이 값을 True 로 지정 하면, 강체와 연결된 제약조건에 약간의 유격을 허용해서 유연하게 움직이도록 만들 수 있다.
- Strength: 이 속성을 0.0 으로 지정하면 적은 힘으로도 더 유연하게 움직이게 되며, 1.0 으로 지정하면 유연성이 사라지게 된다.
3. Ball-and-Socket Constraints
Ball and Socket 으로 연결된 두 개의 강체중에서 Ball 에 해당되는 강체가 Socket에 해당되는 강체 와의 연결 지점 인 Pivot Point 를 기준으로 회전이 가능하도록 한다.
이 제약 조건에는 공통 속성 외에 따로 추가적인 속성은 없다
사람과 동물의 관절을 연출하거나 가방이나 악세서리 등의 장착물을 위해 자주 활용 된다
개별 Ragdoll Constraint 의 설정이 아닌 캐릭터 전체를 위해 특화된 Ragdoll 에 대해서는 다음 절에서 곧 이어서 설명하도록 하겠다.
Stiff Spring에서는 Rigid Body가 지정된 거리만큼 떨어진채 연결 한다
Stiff Spring은 각 강체 내 특정 지점에서 작동되고, 강체는 자유롭게 지점 주위를 이동하고 회전하지만, 서로에 대한 일정한 상대 거리를 유지하게 된다
Cable Renderer 컴포넌트는 Chain을 실린더 세그먼트의 인접 집합으로 렌더링 한다
- hkpConstraintStabilizationUtil 을 사용하면 Constraint 시스템을 미리 안정화 시켜둘 수 있다.
- 가벼운 물체가 무거운 물체들 사이에 연결되어 있거나 고정된 물체 사이에 무거운 물체가 연결되어 있는 경우 안정화 되기가 어렵다 연결된 강체의 물체의 질량의 차이가 10배 이상이 나지 않도록 주의한다
- 많은 수의 강체가 연결되어 있을 경우 모든 Constraint 들의 tau 값을 낮추는게 좋다. 다음과 같은 공식을 따르면 적당하다. tau = 1.0/sqrt (연결된constraints 개수)
- 강체의 Damping 값을 0.6 정도로 약간 줄여준다
- Substep을 증가시켜서 물리 시뮬레이션의 정밀도를 올린다.
- Solver tau 와 damping 값을 증가 한다 (hkpWorldCinfo::SolverType 참조
'Game Engine & Middlewares > Havok' 카테고리의 다른 글
[하복 물리 엔진 강좌] 03. Vision 엔진에서 캐릭터 컨트롤러 사용하기 (0) | 2014.12.12 |
---|---|
[하복 물리 엔진 강좌] 02. Vision 엔진에서 Havok Rigid Body 컴포넌트 다루기 (1) | 2014.12.12 |
[하복 물리 엔진 강좌] 01. 물리 엔진에 대한 기본적인 이해 (0) | 2014.12.12 |
[프로젝트 아나키 강좌] 05. 첫번째 vForge 프로젝트 만들기 (0) | 2014.06.06 |
[프로젝트 아나키 강좌] 04. vForge 에디터 소개 (0) | 2014.06.06 |