티스토리 뷰
TMI(Triangle Mesh Information) Project #6.1 - Collision Detection 에 사용되는 여러가지 Bounding Box, Sphere
배고플땐스윙칩 2021. 8. 25. 15:50이전 포스팅에서는 VTK Collision Detection Filter를 활용하여 Collision을 Check하고 Rendering 해보았습니다.
https://mathmakeworld.tistory.com/99
0. 들어가기 앞서
Collision Detection을 판단할 때 Bounding Box와 Sphere를 활용하여 Collision Detection을 판단할 수 있습니다. 그 것에 기본이 되는 Bounding Box의 두가지 종류인 AABB와 OBB, 그리고 Bounding Sphere를 알아보고 직접 VTK를 활용하여 만들어보도록 하겠습니다.
1. AABB
AABB란 Axis-Aligned Bounding Box의 줄임말입니다. 말 그대로 축이 정렬되어있는 Bounding Box라는 뜻입니다. 2D에서는 x y 축에 정렬된 Box를 말하고 3D에서는 z축까지 정렬 된 Box를 이야기합니다.
아래 이미지를 보시면 두 마리 고양이가 일정한 축을 가지는 Box에 들어가 있는 것을 확인 하실 수 있습니다.
AABB가 가지고 있는 값은 아래와 같습니다.
- min 좌표 (mesh가 가진 모든 vertex의 x,y,z 각각의 min값)
- max 좌표 (mesh가 가진 모든 vertex의 x,y,z 각각의 max값)
이렇게 2가지 값만 가지고 있습니다. Bounding Box의 Center값은 (min + max) * 0.5로 쉽게 구할 수 있습니다.
장점으로는
1. 축이 정렬되어 있어 저장해야 할 데이터가 적다.
2. 충돌 계산이 간단하다.
단점으로는
1. Rotation에 약하다.(Rotation 할 때마다 Bounding Box를 새롭게 정의해야 한다.)
2. 위의 그림에서 보이듯이 Rotation에 따라 Mesh가 없지만 Bounding Box안에 포함되는 영역이 많을 수 있다.
코드로 확인해보자면 첨부한 Git의 Example_2_BoundingBox 필터의 Example_2_BoundingBox_Util.cpp을 확인하시면 아래 코드를 찾으실 수 있습니다.
VTK에서 제공하는 OutlineFilter는 AABB를 생성해주기 때문에 이 Filter를 이용하여 AABB Actor를 생성 할 수 있습니다.
실행하신 뒤 4번과 space를 누르면 고양이 Mesh에 AABB가 생성되는 것을 확인하실 수 있습니다.
2. OBB
OBB란 Oriented Bounding Box의 줄임말입니다. OBB는 AABB와는 다르게 Mesh의 회전과는 상관없이 각각의 축 값을 가지고 있기 때문에 Fit한 Bounding Box를 제공합니다.
아래 이미지를 보시면 두 마리 고양이가 각각 다른 축을 가지는 Box에 들어가 있는 것을 확인 하실 수 있습니다.
OBB가 가지고 있는 값은 아래와 같습니다.
- Center 좌표
- Axis : (3가지 방향으로 각각의 벡터를 가짐)
- Extent : 3가지 방향으로 Box의 크기
Bounding Box의 각 꼭지점 좌표는 Center값 + 원하는 방향벡터 + 원하는 방향의 Extent 값으로 구할 수 있습니다.
장점으로는
1. Rotation에 강하다. (Mesh가 Rotation 되어도 Box를 새롭게 정의할 필요가 없다.)
2. AABB에 비해 빈공간이 적어 여러 연산에 Error가 적다.
단점으로는
1. 충돌 계산이 복잡하다.
코드로 확인해보자면 AABB와 같이 첨부한 Git의 Example_2_BoundingBox 필터의 Example_2_BoundingBox_Util.cpp을 확인하시면 아래 코드를 찾으실 수 있습니다.
OBB도 똑같이 VTK에서 vtkOBBTree라는 Class로 제공됩니다. 하지만 OBB로 이루어진 Tree 구조이기 때문에 Level을 1로 두었고, 다음에 Bounding Box만 따로 구현하는 코드를 직접 짜보도록 하겠습니다. AABB와 같이 space를 눌러 BBox Rendering을 활성화 시켜준 다음 5번을 누르면 OBB를 확인하실 수 있습니다.
3. Sphere Bounding Box
Sphere란 Mesh의 Center 좌표를 기준으로 가장 먼 vertex와의 거리를 반지름으로 가지는 구(2D에서는 원)로 Bounding Box를 생성하는 것 입니다.
아래 이미지를 보시면 두 마리 고양이가 각각의 Sphere에 들어가 있는 것을 확인 하실 수 있습니다.
Sphere Bounding Box가 가지고 있는 값은 아래와 같습니다.
- Center 좌표
- Radius 값
Sphere Bounding Box의 장점으로는
1. Rotation에 강하다. (Mesh가 Rotation 되어도 Box를 새롭게 정의할 필요가 없다.)
2. 충돌 계산이 빠르다.
단점으로는
1. 그림에서 보이는 것과 같이 Mesh가 얇고 길어질수록 불필요한 공간이 많아진다.
코드는 AABB와 OBB와 마찬가지로 Example_2_BoundingBox_Util.cpp에 있습니다.
SPhere Bounding Box는 vtkSphereSource라는 것으로 제공됩니다. SetRadius와 SetCenter를 활용하여 반지름과 Center좌표를 변경할 수 잇고 SetPhiResolution과 SetThetaResolution을 통해 구의 해상도를 조절할 수 있습니다. 똑같이 space를 눌러 BBox Rendering을 활성화 시켜준 다음 6번을 누르면 Sphere를 확인하실 수 있습니다.
이 Code들을 아래 링크를 타고 들어가시면 Git에 저장해두고 있습니다. 혹시 궁금한 것이 있다면 댓글로 남겨주시면 바로 답변해드리도록 하겠습니다.
오늘은 대표적인 3가지 Bounding Box에 대해서 알아보았습니다. 다음 포스팅에서는 AABB와 Sphere Bounding Box의 충돌 처리에 대해 알아보도록 하겠습니다.
'Mesh Processing' 카테고리의 다른 글
- Total
- Today
- Yesterday
- RubiksCube
- transform
- batching
- opengl
- Mesh Processing
- NDC
- perspective projection
- Scriptable Render Pipeline
- 참조 형식
- VTK
- static batching
- Unreal
- reference type
- 값 형식
- 강화학습
- Unity
- C#
- collision detection
- value type
- MeshProcessing
- 루빅스큐브
- 유니티
- dynamic batching
- Mesh
- CollisionDetection
- Transformation
- SRP
- RL
- normalized device coordinate
- AABB
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |