본문 바로가기
학원

DirectX 3D Box Collision

by Srff5123 2023. 11. 9.
728x90

박스 형태의 충돌 구현

 

 

Box 충돌을 위한 BoxCollider.h파일 생성

OBB충돌로 구현 분리축 이론을 바탕으로 하는데 

3D OBB충돌 같은경우에는 특정 기준 바탕으로 축으로 투영을시켜 길이 두개를 구하여 

a의 길이와 b의 길이의 합이 d보다 크면 충돌하지 않은 상태 

 

x - 사각형의 가로축 절반에 RIght vector를 곱해줌

y - 사각형의 세로축의 절반에 up vector를 곱해줌

x + y = z가 나오게 되고

 

z와 a가 내적하면 a 의 크기를 알 수 있다.

그래서 halfsize Vector변수를 써준다.

 

 

struct로 obbDesc생성하여

vector로 pos값과, axis -  3개 잡아주는데  right vector: x  up vector : y  forward vector : z

 

다음 생성자 소멸자 만들어주고 소멸자는 default값 넣어주기

 

obb 참조형 받아 넣어주기 위한 GetObb함수

 

obb같은 경우는 분리축이론으로 하기 때문에 특정 축을 기준으로 나눠져있는지

아닌지 확인 하기 위한 bool형으로 IsSeperateAxis 함수 만들어주기    Seperate(분리)

 

그다음 private로 vector3의 size를 만들어준다음

 

 

 

cpp파일 생성

우선 박스 이기 때문에 MakeMesh에 vertices와 indices 선으로만  찍어주고

 

CollisionScene.cpp에서 전에 썼던 Sphere 주석처리 후 Boxcollider 추가 후 Box가 잘나오는지 테스트

 

이제 충돌 구현을 위해 다시 BoxCollider.cpp 이동하여 GetObb 함수 채워주기

obbDesc.pox를 월드상의 위치를 받아주고

axis는 0번은 월드상의 Rightvector값 받아주고 x축

1번은 y축 up, 2번은 z 축  forward 

 

halfsize는 size의 절반에 scale을 고려하여 GetGlobalScale도 곱해줌

 

 

 

다음 분리축

그림 d 의 값 구하기 , 내적하다 보면 음수가 나올수도 있기 떄문에 abs 절대값 쓰기

a b 값 구해주고

d 와 a + b 비교하여 true false로 충돌여부 반환  

 

xyz 3축으로 for 3번 반복

box.halfSize[i]를 하기위한 연산자 오버로딩

 

다음 모서리 부분에 대한 충돌 체크를 위해 외적을 사용하여 수직된축으로 투영을하여 체크

 

우선 두 벡터가 같을 경우의 연산자 오버로딩  추가 

 

박스 1의 축이랑 박스2의 축이랑 하나의 축이라도 겹치면 통과를하고

 

예외를 위해 for문 이용해서 외적으로 한번더 체크를해줌

 

다 체크를 해주어서 모든 축이 다 붙어있다면 true반환하여 충돌처리

 

정리하면 위의 for문으로 기본축 6개 처리해주고 그 외에로 외적으로 한번더 충돌 체크

이제 실행테스트 붙으면 빨간색으로 표시가되어 충돌처리가 잘되는걸 확인할 수 있다.

 

 

 

 

 

 

 

 

 

 

728x90

'학원' 카테고리의 다른 글

DirectX 3D Box-Sphere collision  (1) 2023.11.14
DirectX 3D LayCollision Box  (2) 2023.11.09
DirectX 3D ModelRender  (0) 2023.11.08
DirectX 3D ExportMaterial  (0) 2023.11.08
DirectX 3D SpotLight  (0) 2023.11.08