링(고리) 모양의 오브젝트 사이의 충돌체크를 하는 방법에 대한 글이에요


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



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ




1. 링과 점의 충돌체크




3eec9e36ebd518986abce8954783746515



위의 그림처럼 (x1,y1)으로 링의 중심점의 좌표가 주어지고


or1로 링의 바깥쪽 반지름의 길이가, ir1로 링의 안쪽 반지름의 길이가 주어지고


충돌체크를 하려는 점의 좌표가(x2,y2)로 주어져 있을때


두 중심점 사이의 거리 d가 ir1보다 크고, or1보다 작으면 이때 점이 해당 링과 충돌하고 있는 거에요




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

def ring_point(x1,y1,or1,ir1,x2,y2)

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

if d>ir1 && d<or1

return 1

end

return 0

end

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



그리고 위의 코드가 이런식의 링-점 충돌체크의 코드에요, ruby 프로그래밍 언어로 작성한거에요





2. 링과 원의 충돌체크


3eef9e36ebd518986abce8954785706caf




링과 원의 충돌체크에서는, 체크하려는 원이 링의 외부에 있거나 링의 내부에 포함되어있는지를 구해서


만약 두 경우 모두 해당되지 않으면 원이 링과 충돌했다고 판정해요


그리고 위의 그림이 첫번째로 원이 링의 외부에 있는지를 구하는 거에요




역시 앞에서와 마찬가지로 (x1,y1,or1,ir1)로 링의 각각의 값들이 주어져있고


(x2,y2)로 체크하려는 원의 중심점의 좌표가, 그리고 r2로 해당 원의 반지름이 주어져 있을때


두 중심점 사이의 거리 d가 링의 바깥쪽 반지름인 or1과 원의 반지름인 r2의 합보다 크면


이때 원이 링의 바깥에 있게되는거에요

3eee9e36ebd518986abce895478072645a



그리고 위의 그림은 두번째로 원이 링의 안쪽에 포함되어 있는지를 구하는거에요


이때는 두 중심점 사이의 거리 d와 원의 반지름인 r2의 합이


링의 안쪽 반지름인 ir1보다 작으면 원이 링의 내부에 포함되어 있게되는거에요




그리고 최종적으로 위의 두 경우에 해당되지 않으면, 즉 원이 링의 바깥에 있지도 않고, 링의 안쪽에 포함되어 있지도 않으면


이때 원과 링이 충돌하고 있다고 판정해요




ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

def ring_circle(x1,y1,or1,ir1,x2,y2,r2)

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

if d > or1+r2

return 0

end

if d+r2 < ir1

return 0

end

return 1

end

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



그리고 위에 올려놓은 코드가 이런식으로 링과 원의 충돌체크를 하는 코드에요,






3. 링과 링의 충돌체크




링과 링의 충돌에서는 바깥쪽 반지름이 더 큰 링이 더 작은 링 안쪽에 포함되는 경우는 있을수 없으니까


두 링 중에서 더 바깥쪽 반지름이 작은 링을 링이 아닌 원으로 보고, 앞에서 설명한 링과 원의 충돌체크를 적용하면 되요



ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

def ring_ring(x1,y1,or1,ir1,x2,y2,or2,ir2)

if or1 >= or2 

return ring_circle(x1,y1,or1,ir1,x2,y2,or2)

end

if or1 <= or2 

return ring_circle(x2,y2,or2,ir2,x1,y1,or1)

end

end

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



그리고 이게 해당 과정의 코드에요, (x1,y1,or1,ir1) 로 첫번째 링의 값들을 (x2,y2,or2,ir2) 로 두번째 링의 값들을 입력하면 되요


그리고 함수를 사용하려면 앞에서 설명한 링과 원의 충돌체크를 하는 함수도 정의해놓아야 해요








그리고 위의 영상은 앞에서 설명한 코드를 이용해서 인게임에서 링과 링의 충돌체크를 하는 영상이에요


파랑색이 플레이어가 방향키로 움직이는 링이에요, 만약 연두색 링과 충돌한다면 둘다 반투명하게 표시되요




그리고 이런식으로 하면 링(고리) 모양의 오브젝트의 충돌체크를 할 수 있어요