D2 Havok

1,409 views

Published on

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,409
On SlideShare
0
From Embeds
0
Number of Embeds
315
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide
  • 영화 : Matrix, 트로이 , 포세이돈 게임 : 스타크래프트 2 등 RTS, 바이오쇼크 2, 하프라이프 등 FPS FX 사라진듯하지만 AI, Cloth, Destruction 가 생김
  • Wrapper : Share.HavokCommon.dll Usage : Share.Havok.dll
  • Sync 는 Console 게임에 적합 Async 는 PC 나 Server 에 적합 우리는 Async 사용 , 정확도 등의 문제 때문에 “일정한 작은 시간”으로 쪼개어 Simulation
  • CenterMap 이 변경되면 물체들을 상대 좌표로 이동시킴
  • WorldEditor 에서 저장하면 Terrain Mopp 는 생성됨 RigidBody 용 Mopp 는 실시간 생성 - WorldArena 100ms 정도 - 백단위 폴리곤은 5-6ms 정도
  • 계단 오르기가 힘들어서 Proxy 를 사용했었는데 ... RigidBody 가 더 좋아보임
  • HavokSystem 은 3 개 클래스를 Has 하는 통합 관리 Class
  • D2 Havok

    1. 1. Havok(Physics) <ul><li>Contents </li></ul><ul><ul><li>About </li></ul></ul><ul><ul><li>Classes </li></ul></ul><ul><ul><ul><li>Wrapper </li></ul></ul></ul><ul><ul><ul><li>Usage </li></ul></ul></ul><ul><ul><li>ETC </li></ul></ul><ul><ul><li>QnA </li></ul></ul>
    2. 2. About <ul><li>Havok </li></ul><ul><li>아일랜드 회사 ( 현재 Intel.com 이 인수 ) 인 Havok.com 이 만든 물리 엔진으로 2000 년 첫 개발 이후 약 150 여개의 게임과 영화에서 사용 되었다 . Window, Xbox, PS, Wii, Linux, Mac 등의 플랫폼 /OS 에서 동작하며 C++ 컴파일러가 있는 시스템이면 포팅이 가능할 정도로 호환성이 우수 하다 ....... 다만 CLI 는 없다 ! </li></ul><ul><ul><li>Physics </li></ul></ul><ul><ul><li>Animation </li></ul></ul><ul><ul><li>FX (Smoke 등의 효과 표현을 위한 PS 3.0 를 이용한 SW) </li></ul></ul><ul><li>hav·oc [hǽvək] </li></ul><ul><ul><li>n. ( 불가산 ) ( 대규모의 ) 파괴 , 황폐 ; 대혼란 , 대혼잡 , 무질서 </li></ul></ul><ul><ul><li>v. 크게 파괴하다 , 쑥밭을 만들다 , 황폐화하다 </li></ul></ul>
    3. 3. Classes <ul><li>Wrapper (Share/Library/HavokCommon) </li></ul><ul><ul><li>Framework </li></ul></ul><ul><ul><li>World </li></ul></ul><ul><ul><li>Object </li></ul></ul><ul><ul><ul><li>Terrain </li></ul></ul></ul><ul><ul><ul><li>Rigidbody </li></ul></ul></ul><ul><ul><ul><li>Character (Proxy, Rigidbody) </li></ul></ul></ul><ul><li>Usage (Share/Havok) </li></ul><ul><ul><li>HavokSystem </li></ul></ul><ul><ul><li>HavokRepository </li></ul></ul>
    4. 4. Wrapper <ul><li>Framework </li></ul><ul><li>프레임 당 Simulation 을 Update </li></ul><ul><ul><li>SingleThread : Simulation 을 SingleThread 로 </li></ul></ul><ul><ul><ul><li>Sync : Frame 시간을 고정 </li></ul></ul></ul><ul><ul><ul><li>Async : Frame 시간이 가변적일 때 </li></ul></ul></ul><ul><ul><li>Multithread : MultiThread 로 </li></ul></ul><ul><ul><ul><li>Sync </li></ul></ul></ul><ul><ul><ul><li>Async </li></ul></ul></ul><ul><ul><li>TimeStep 이 커지면 Simulation 이 불안정해진다 . ( 오일러 적분기 사용의 폐해 ) </li></ul></ul>
    5. 5. Wrapper <ul><li>World </li></ul><ul><li>Scene 과 유사한 기능 </li></ul><ul><li>Character, RigidBody, Terrain 등 Add/Remove </li></ul><ul><ul><li>Broadphase </li></ul></ul><ul><ul><ul><li>Havok 의 Simulation 영역 </li></ul></ul></ul><ul><ul><ul><li>현재 3x3 Map 영역을 커버 (CenterMap 기준 ) </li></ul></ul></ul><ul><ul><ul><li>영역 밖의 물체는 Simulation 되지 않음 </li></ul></ul></ul>
    6. 6. Wrapper <ul><li>Mopp (Memory Optimized Partial Polytope) </li></ul><ul><li>속도 , 메모리 등에서 최적화 된 Binary Shape 로 Compile 및 Serialize 필요 ( ♠ Code 1 ) </li></ul><ul><li>RigidBody </li></ul><ul><ul><li>Entity Has 1 Rigidbody </li></ul></ul><ul><ul><li>ProcessChangeTransform 에서 RigidBody 의 Transform 을 실시간으로 변경 ( ♠ Code 2 ) </li></ul></ul><ul><ul><li>기본적으로 Scale 이 불가능하므로 Scale 이 필요할 경우 Mopp 를 재생성 ( ♠ Code 3 ) </li></ul></ul><ul><li>Terrain </li></ul><ul><ul><li>엄밀히 말하면 RigidBody </li></ul></ul>
    7. 7. Wrapper <ul><li>Character Controller </li></ul><ul><ul><li>RigidBody </li></ul></ul><ul><ul><ul><li>효율적 ( 별도의 simulation step 이 불필요 ) </li></ul></ul></ul><ul><ul><ul><li>Simulation 이 정확 </li></ul></ul></ul><ul><ul><ul><li>계단 올라가기 힘들다 </li></ul></ul></ul><ul><ul><li>Proxy </li></ul></ul><ul><ul><ul><li>많은 테스트를 거쳐 안정적임 </li></ul></ul></ul><ul><ul><ul><li>다중충돌시 부정확함 </li></ul></ul></ul><ul><ul><ul><li>상대적으로 비효율적임 </li></ul></ul></ul>
    8. 8. Usage <ul><li>HavokSystem </li></ul><ul><ul><li>Framework </li></ul></ul><ul><ul><li>World </li></ul></ul><ul><ul><li>Repository </li></ul></ul><ul><li>HavokRepository </li></ul><ul><li>Havok 관련 Object 생성 / 소멸 관리 </li></ul><ul><li>Cache 기능 (RefCount 이용 ) </li></ul><ul><li>※ Object 생성 순서 </li></ul><ul><ul><ul><ul><li>Empty Constructor -> Add to Repository -> Init ( ♠ Code 4 ) </li></ul></ul></ul></ul>
    9. 9. Usage <ul><li>Engine </li></ul><ul><ul><li>HavokSystem </li></ul></ul><ul><ul><ul><li>HavokFramework </li></ul></ul></ul><ul><ul><ul><ul><li>Update() </li></ul></ul></ul></ul><ul><ul><ul><li>HavokWorld </li></ul></ul></ul><ul><ul><ul><ul><li>BroadPhase </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Add Objects() </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Remove Objects() </li></ul></ul></ul></ul><ul><ul><ul><li>HavokRepository </li></ul></ul></ul><ul><ul><ul><ul><li>Create Objects() </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Release Objects() </li></ul></ul></ul></ul>Engine.Create(); new HavokSystem() CreateResource, Entity() HavokRepository.Create(); if (Inside of BroadPhase) HavokWorld.Add(obj) Engine.Update(); HavokWorld.UpdateCenterMap(); HavokBroadPhase.Shift(); if (Outside of BroadPhase()) HavokWorld.Remove(obj); if (Inside of BroadPhase()) HavokWorld.Add(obj); HavokFramework.Update(); Engine.Dispose(); HavokSystem.Dispose(); HavokRepository.Dispose(); all obj.Dispose();
    10. 10. ETC <ul><li>Singleton </li></ul><ul><li>Havok 내부적으로 static global 이나 Singleton 을 사용하므로 </li></ul><ul><li>Main Framework 는 1 개 /1process 여야만 한다 . </li></ul><ul><li>ThreadMemory </li></ul><ul><li>Havok 관련 객체를 생성하는 Thread 를 만들 경우 </li></ul><ul><li>( 예 :ResourceLoadingThread) </li></ul><ul><li>Thread 의 Running Body 에서 HavokThreadMemory 를 만들고 </li></ul><ul><li>소멸해줘야 한다 .( ♠ Code 5 참조 ) </li></ul><ul><li>Finalize </li></ul><ul><li>Havok 객체는 GC 가 소멸하지 않도록 Havok Thread </li></ul><ul><li>(Framework 을 생성한 MainThread 혹은 HavokThreadMemory </li></ul><ul><li>가 초기화된 Thread) 에서 명시적으로 Dispose 해야 함 . </li></ul>
    11. 11. QnA <ul><li>Any Questions? </li></ul><ul><li>http://software.intel.com/en-us/forums/havok/ </li></ul>

    ×