부채꼴 모양의 오브젝트의 충돌체크를 하는 방법에 대한 글이에요


그리고 저도 잘 아는게 아니고 제가 이해한 범위 안에서만 쓰는 내용이라, 틀리거나 잘못된 내용이 있을수도 있어요



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ




1. 부채꼴과 점의 충돌체크




28ef9e36ebd518986abce8954e827664

위의 그림처럼 시작점의 좌표가 (x1,y1)이고


중심 각도가 a1이고 중심의 각도로부터 양쪽 끝까지의 각도의 너비가 s1이고


반지름이 r1인 부채꼴이 주어져 있을때


이 부채꼴의 범위 안에 점 x2,y2가 포함되려면 두가지 조건을 만족해야해요




우선 첫번째로 점 (x1,y1)에서 점 (x2,y2)까지의 각도가, 


a1+s1 그리고 a1-s1사이의 범위에 있어야 해요


즉, 각도 a1과 앞에서 말한 두 점 사이의 각도가


s1보다 작아야 해요




그리고 두번째로 위의 조건이 만족되었을때


점 (x1,y1)과 (x2,y2)사이의 거리인 d가


부채꼴의 반지름인 r1보다 작아야 해요




그리고 위의 조건을 충족하면, 최종적으로 해당 점은 부채꼴 내부에 포함되게 되는거에요



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

def circulator_point(x1,y1,a1,s1,r1,x2,y2)

angle = Math.atan2(y2-y1,x2-x1)

if Math.acos(Math.cos(a1)*Math.cos(angle)+Math.sin(a1)*Math.sin(angle)) > s1

return 0

end

dist = ((x2-x1)**2+(y2-y1)**2)**0.5

if dist > r1

return 0

end

return 1

end

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



그리고 위에 올려놓은 코드가 앞에서 설명한대로 부채꼴과 점의 충돌을 체크하는 코드에요, ruby프로그래밍 언어로 작성한거에요


(x1,y1,a1,s1,r1,x2,y2)에 위의 그림에 나와있는대로 값들을 입력하면 최종적으로 해당 점이 부채꼴 내부에 있다면 1을, 그렇지 않다면 0을 출력해줘요




https://gall.dcinside.com/m/game_dev/162026

벡터의 연산과 활용 - 인디 게임 개발 마이너 갤러리

[시리즈] 게임제작 · GJK알고리즘을 사용한 다양한 도형의 충돌판정 구하기 · GJK-EPA 알고리즘으로 플레이어를 밀어내는 오브젝트 만들기 · 분리축(SAT)충돌검사를 사용해서 밀어내는 오브젝트 만들기 · OBB

gall.dcinside.com


이때 활용하는 두 각 사이의 각도를 구하는 방법은 위에 올려놓은 글의 19번에서 설명하고 있는 방식이에요






2. 부채꼴과 원의 충돌체크




3aee9e36ebd518986abce895478675642d

두번째는 부채꼴과 원의 충돌체크를 하는 방법이에요


그리고 이건 두가지 경우로 나눠서 체크할수 있어요




첫번째는 위의 그림의 위에 나와있는 경우처럼


부채꼴의 시작점에서 원의 중심까지의 각도가 부채꼴의 너비각 안에 포함되는 경우에요,


즉 두 점 사이의 각도와 부채꼴의 중심각도a1 사이의 각도가 s1보다 작은 경우에요, 앞의 부채꼴과 점과의 충돌을 설명했을때랑 동일한 방식이에요




그리고 만약 이렇게 첫번째 경우라면


부채꼴의 시작점과 원의 중심점 사이의 거리 d가 부채꼴의 반지름 r1과 원의 반지름 r2의 합보다 작다면 


이때 부채꼴이 원과 충돌하고 있다고 판정해요




두번째 경우는 위의 그림의 아래에 나와있는 경우에요


첫번째와는 반대로 부채꼴의 시작점에서 원의 중심점 까지의 각도가, 부채꼴의 너비각 안에 포함되어 있지 않은 경우에요


그리고 이때는 그림에서 파랑색으로 표시된 부채꼴의 양 끝 선분이 원에 포함되어 있다면 부채꼴이 원과 충돌하고 있다고 판정해요




https://gall.dcinside.com/m/game_dev/171644

원과 다각형의 충돌체크 - 인디 게임 개발 마이너 갤러리

[시리즈] 게임제작 · GJK알고리즘을 사용한 다양한 도형의 충돌판정 구하기 · GJK-EPA 알고리즘으로 플레이어를 밀어내는 오브젝트 만들기 · 분리축(SAT)충돌검사를 사용해서 밀어내는 오브젝트 만들기 · OBB

gall.dcinside.com




그리고 이때 선분이 원에 포함되어있는지 체크하는 방법은, 위에 올려놓은 글의 2번에서 설명하고 있는 방식이에요





ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

def circulator_circle(x1,y1,a1,s1,r1,x2,y2,r2)

angle = Math.atan2(y2-y1,x2-x1)

if Math.acos(Math.cos(a1)*Math.cos(angle)+Math.sin(a1)*Math.sin(angle)) > s1

vx1, vy1 = x1+r1*Math.cos(a1+s1), y1+r1*Math.sin(a1+s1)

vx2, vy2 = x1+r1*Math.cos(a1-s1), y1+r1*Math.sin(a1-s1)

if circle_line(x1,y1,vx1,vy1,x2,y2,r2) == 1 || circle_line(x1,y1,vx2,vy2,x2,y2,r2) == 1

return 1

end

return 0

end

dist = ((x2-x1)**2+(y2-y1)**2)**0.5

if dist > r1+r2

return 0

end

return 1

end

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


그리고 위에 올려놓은 코드가 이런 방식으로 부채꼴과 원의 충돌을 체크하는 함수의 코드에요,


(x1,y1,a1,s1,r1,x2,y2,r2)에 위의 그림에 나와있는대로 값을 입력하면 충돌했다면 1을 그렇지 않다면 0을 출력해요


그리고 위의 함수를 사용하려면 앞에 올려놓은 글의 2번에 나와있는 함수 역시 정의해놓아야해요







그리고 위에 올려놓은 영상이 앞에서 설명한대로 부채꼴과 원의 충돌체크를 인게임에서 적용한 영상이에요


파랑색 원이 플레이어가 움직이는 오브젝트에요, 그리고 중앙에서 회전하는 연두색 부채꼴 모양 오브젝트에 충돌했다면 둘 다 불투명하게 표시되요





그리고 이렇게 하면 부채꼴 모양의 오브젝트의 충돌체크를 할 수 있어요