ยท GJK-EPA ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ ๋ง๋ค๊ธฐ
ยท ๋ถ๋ฆฌ์ถ(SAT)์ถฉ๋๊ฒ์ฌ๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ ๋ง๋ค๊ธฐ
ยท OBB์ถฉ๋๊ฒ์ฌ๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ ๋ง๋ค๊ธฐ
์ ์ถฉ๋์ฒดํฌ๋ AABB ์ถฉ๋์ฒดํฌ๋ฅผ ์ฌ์ฉํด์ ์ถฉ๋์ฒดํฌ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธ์ด์์
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ํ์ด๋ ํ๋ก๊ทธ๋๋ฐ์ ์ ์๋๊ฒ ์๋๊ณ ์ ๊ฐ ์ดํดํ ๋ฒ์ ์์์ ์ฐ๋ ๋ด์ฉ์ด๋ผ ํ๋ฆฌ๊ฑฐ๋ ์๋ชป๋ ๋ถ๋ถ์ด ์์์๋ ์์ด์
ใ
กใ
กใ
กใ
กใ
กใ
กใ
กใ
ก
1. ์(circle) ์ถฉ๋์ฒดํฌ
์ ์ถฉ๋์ฒดํฌ๋ ์์ ์ฌ๋ผ์์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋ ์์ด ์ถฉ๋ํ๋์ง ์ํ๋์ง๋ฅผ ์ฒดํฌํ๋ ๋ฐฉ๋ฒ์ด์์
๋ ์์ ์ค์ฌ์ ์ ์ขํ๊ฐ ๊ฐ๊ฐ (x1,y1) (x2,y2)๊ณ ๋ฐ์ง๋ฆ์ด ๊ฐ๊ฐ r1 r2 ๋ผ๋ฉด
๋ ์ค์ฌ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ธ ( (x2-x1)^2+(y2-y1)^2 )^0.5 ๊ฐ r1๊ณผ r2์ ํฉ๋ณด๋ค ์์ผ๋ฉด ์ถฉ๋ํ๋ค๊ณ ํ์ ํด์
์์ ์์์ ^2๋ ์ ๊ณฑ์ด๊ณ , ^0.5๋ ๋ฃจํธ์์, ๋ ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๊ณต์์ด์์
์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ ๋ ์์ ๋ฐ์ง๋ฆ์ ํฉ๋ณด๋ค ๋ ์ค์ฌ์ ์ฌ์ด์ ๊ธธ์ด๊ฐ ๋ ๊ธฐ๋๊น ๋ ์์ ์ถฉ๋ํ์ง ์์๋ค๊ณ ํ์ ํด์
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ๊ทธ๋ฆผ์ ๋ ์์ ๋ฐ์ง๋ฆ์ ํฉ๋ณด๋ค ์ค์ฌ์ ์ฌ์ด์ ๊ธธ์ด๊ฐ ๋ ์์ผ๋๊น ๋ ์์ด ์ถฉ๋ํ๋ค๊ณ ํ์ ํ๋๊ฑฐ์์
์์ ๊ทธ๋ฆผ์ ๋ ์์ด ์ถฉ๋ํ์๋์ ์ถฉ๋๋ฒกํฐ๋ฅผ ๋ํ๋ธ ๊ทธ๋ฆผ์ด์์
์ถฉ๋๋ฒกํฐ๋ ๋ ์์ด ์ถฉ๋ํ์๋, ๋ ์์ด ์๋ก ์ถฉ๋ํ์ง ์๋๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์๊ธธ์ด์ ๋ฒกํฐ๋ฅผ ์ด์ผ๊ธฐํ๋๊ฑฐ์์
์ฌ๊ธฐ์๋ ์ค๋ฅธ์ชฝ ์์ ์ผ์ชฝ ์๊ณผ ์ถฉ๋ํ์ง ์๋ ์์น๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์๊ฑฐ๋ฆฌ์ ๋ฒกํฐ๋ก ๊ฐ์ ํ์ด์, ์์ ๊ทธ๋ฆผ์์ ์ด๋ก์ ํ์ดํ๋ก ๋ํ๋ธ ๋ฒกํฐ์์
๊ทธ๋ฆฌ๊ณ ๋ ์์ ์ถฉ๋์์์ ์ถฉ๋๋ฒกํฐ์ ๊ธธ์ด๋ ๋ ์์ ๋ฐ์ง๋ฆ์ ํฉ์์ ์ค์ฌ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ๋ฅผ ๋บ ๊ฐ์ด์์, ์ฆ ์์ ๊ทธ๋ฆผ์์ r1+r2์์ d๋ฅผ ๋บ ๊ฐ์ด์์
๊ทธ๋ฌ๋ฉด ๋ ์์ ๋ฐ์ง๋ฆ์ด ๊ฒน์น๋ ๊ตฌ๊ฐ์ ๊ธธ์ด๋ฅผ ์ป์์ ์์ด์,
๊ทธ๋ฆฌ๊ณ ์ถฉ๋๋ฒกํฐ์ ๋ฐฉํฅ์ ๋ ์์ ํ ์ค์ฌ์ ์์ ๋ค๋ฅธ ์ค์ฌ์ ๊น์ง์ ๋ฐฉํฅ์ด์์, ์ฌ๊ธฐ์๋ ์ค๋ฅธ์ชฝ ์์ ์ผ์ชฝ ์ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์, x1,y1์์ x2,y2๋ก ํฅํ๋ ๋ฐฉํฅ์ด ๋์
์ฆ, ๋๋ฒ์งธ ์์ ์ค์ฌ์ ์ ์ขํ์์, ์ฒซ๋ฒ์งธ ์์ ์ค์ฌ์ ์ ์ขํ๋ฅผ ๋นผ์, ์ฒซ๋ฒ์งธ์์ ๋๋ฒ์งธ๋ก ํฅํ๋ ๋ฒกํฐ๋ฅผ ์ป์๋ค์,
ํด๋น ๋ฒกํฐ๋ฅผ ์ ๊ทํ(๋ฒกํฐ์ x,y๊ฐ๊ฐ์ ํด๋น ๋ฒกํฐ์ ๊ธธ์ด๋ก ๋๋๋๊ฒ)ํด์ ๋จ์๋ฒกํฐ(๊ธธ์ด๊ฐ 1์ธ ๋ฒกํฐ)๋ก ๋ง๋ค๊ณ , ์ฌ๊ธฐ์ ์์์ ๊ตฌํ ์ถฉ๋๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ณฑํด์ฃผ๋ฉด
๋๋ฒ์งธ ์์ ์ฒซ๋ฒ์งธ ์ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ถฉ๋๋ฒกํฐ๋ฅผ ์ป์์ ์์ด์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def circle_collision(x1,y1,r1,x2,y2,r2)
d = ((x2-x1)**2+(y2-y1)**2)**0.5
if d < r1+r2
return (r1+r2-d)*((x2-x1)/d) , (r1+r2-d)*((y2-y1)/d)
else
return nil,nil
end
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ rubyํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ ์ ์ถฉ๋์ฒดํฌ์ ์ฝ๋์์
๋ ์์ ์ค์ฌ์ ๊ณผ ๋ฐ์ง๋ฆ์ ๊ฐ๊ฐ x1,y1,r1 x2,y2,r2๋ก ์ ๋ ฅํ๋ฉด
๋ ์์ด ์ถฉ๋ํ์ง ์์๋ค๋ฉด nil์ ์ถ๋ ฅํ๊ณ , ์ถฉ๋ํ๋ค๋ฉด ๊ทธ๋ x2,y2,r2์์ x1,y1,r1์ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ๋ฒกํฐ๋ฅผ ์ถ๋ ฅํด์ค์
2. AABB์ถฉ๋์ฒดํฌ
AABB์ถฉ๋์ฒดํฌ๋ ๊ธฐ์ธ์ด์ง์ง ์์ ๋ ์ฌ๊ฐํ๊ฐ์ ์ถฉ๋์ ์ฒดํฌํ๋ ๋ฐฉ๋ฒ์ด์์
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์๋ ์์ ๊ทธ๋ฆผ์ ๋์์๋๊ฒ์ฒ๋ผ ๊ฐ ์ฌ๊ฐํ๋ค์ ์ค์ฌ์ ์ ์ขํ x1,y1 x2,y2์
๊ฐ ์ฌ๊ฐํ๋ณ๋ก ์ค์ฌ์ ์์ x์ถ์ ๊ฐ์ฅ์๋ฆฌ๊น์ง์ ๊ธธ์ด์, y์ถ์ ๊ฐ์ฅ์๋ฆฌ๊น์ง์ ๊ธธ์ด์ธ rx1, ry1 ๊ทธ๋ฆฌ๊ณ rx2, ry2๋ก ์ ๋ ฅํด์ ์ถฉ๋๊ฒ์ฌ๋ฅผ ์งํํด์
๊ทธ๋ฆฌ๊ณ ์ด๋
x์ถ์์ x2-x1์ ์ ๋๊ฐ์ด rx1+rx2๋ณด๋ค ์์ ๊ฒฝ์ฐ์
y์ถ์์ y2-y1์ ์ ๋๊ฐ์ด ry1+ry2๋ณด๋ค ์์ ๊ฒฝ์ฐ๋ฅผ
๋์์ ๋ง์กฑํ๋ค๋ฉด ๋ ์ฌ๊ฐํ์ ์ถฉ๋ํ๋ค๊ณ ํ์ ํด์
x2-x1์ ์ ๋๊ฐ์ x์ถ์์์ ๋ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ์์
๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ์ด ๋ ์ฌ๊ฐํ์ x์ถ ์์์์ ํ์ชฝ ๊ฐ์ฅ์๋ฆฌ๊น์ง์ ๊ธธ์ด์ ํฉ์ธ rx1+rx2๋ณด๋ค ์์ผ๋ฉด
๊ฒฐ๊ตญ ๋ ์ฌ๊ฐํ์ x์ถ์์ ์ ์ ํ๊ณ ์๋ ์์ญ์ด ๊ฒน์น๋ค๋ ์ด์ผ๊ธฐ๊ฐ ๋์
๊ทธ๋ฆฌ๊ณ y์ถ์์๋ ๋์ผํ ๋ฐฉ์์ผ๋ก y2-y1์ ์ ๋๊ฐ์ด ry1+ry2๋ณด๋ค ์๋ค๋ฉด
๊ฒฐ๊ตญ ๋ ์ฌ๊ฐํ์ x์ถ๊ณผ y์ถ ๋ ๋ค์์ ์ ์ ํ๊ณ ์๋ ์์ญ์ด ๊ฒน์น๋ค๋๊ฑฐ๋๊น
๋ ์ฌ๊ฐํ์ ์ถฉ๋ํ๋ค๊ณ ํ์ ํ๋๊ฑฐ์์
์์ ์ฒซ๋ฒ์งธ ๋๋ฒ์งธ ๊ทธ๋ฆผ์ด ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ์ง ์์ ๊ฒฝ์ฐ๊ณ , ์ธ๋ฒ์งธ ๊ทธ๋ฆผ์ด ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ ๊ฒฝ์ฐ์์
์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ x์ถ y์ถ ๋ ๋ค์์ ์ ์ ํ๊ณ ์๋ ์์ญ์ด ๊ฒน์น์ง ์๊ณ
๋๋ฒ์งธ ๊ทธ๋ฆผ์ y์ถ์์๋ ์์ญ์ด ๊ฒน์น์ง๋ง x์ถ์์๋ ์์ญ์ด ๊ฒน์น์ง ์๋ ๊ฒฝ์ฐ์์, ์ฆ ์ถฉ๋ํ์ง ์๋ ๊ฒฝ์ฐ์์
๊ทธ๋ฆฌ๊ณ ์ธ๋ฒ์งธ ๊ทธ๋ฆผ์ x์ถ y์ถ ๋ ๋ค์์ ์ ์ ํ๊ณ ์๋ ์์ญ์ด ๊ฒน์ณ์ ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ ๊ฒฝ์ฐ์์
์ฌ๊ฐํ์ ์ถฉ๋์์์ ์ถฉ๋๋ฒกํฐ ์ญ์, ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ ๋ ์ฌ๊ฐํ์ ์๋ก ์ถฉ๋ํ์ง ์๋ ์์น๋ก ๋ฐ์ด๋ด๊ธฐ ์ํ ์ต์๊ฑฐ๋ฆฌ์ ๋ฒกํฐ๋ฅผ ์ด์ผ๊ธฐํด์
๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ ๋์ ์ถฉ๋๋ฒกํฐ๋, x์ถ๊ณผ y์ถ์ ๊ฒน์น๋ ๊ธธ์ด ์ค์์ ๋ ๊ธธ์ด๊ฐ ์งง์ ์ชฝ์ด์์
์ฆ, x์ถ์์ ๊ฒน์น๋ ๊ธธ์ด์ y์ถ์์ ๊ฒน์น๋ ๊ธธ์ด๋ฅผ ๊ตฌํ๋ค์, ๋์ค์์ ๋ ๊ธธ์ด๊ฐ ์งง์ ์ถ์์, ํด๋น ๊ธธ์ด๋งํผ ์ด๋์ํค๋ฉด ๋์
์ฆ, x์ถ๊ณผ y์ถ ๋ ๋ค์์ ์ด๋ํ์ง ์๊ณ x์ถ์์๋ง ์ด๋ํ๊ฑฐ๋ y์ถ์์๋ง ์ด๋ํด์
์์ ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ x์ถ๊ณผ y์ถ ๊ฐ๊ฐ์ ์ถ์์ ๊ฒน์น๋ ์์ญ์ ํ์ํด๋์ ๊ทธ๋ฆผ์ด์์
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ๊ทธ๋ฆผ์ ๊ฒฝ์ฐ์์ ์ถฉ๋๋ฒกํฐ๋ ๋ ๊ธธ์ด๊ฐ ์งง์ ์ด๋ก์(y์ถ)์ด์์
๊ทธ๋ฆฌ๊ณ ์ถฉ๋๋ฒกํฐ์ ๋ฐฉํฅ์ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ์ค์ ํ๋ฉด ๋์, ๋ง์ฝ 2๋ฒ ์ฌ๊ฐํ์ 1๋ฒ ์ฌ๊ฐํ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๊ณ ์ถ๋ค๋ฉด
x2๊ฐ x1๋ณด๋ค ํด๊ฒฝ์ฐ์ +๋ฐฉํฅ, ์์๊ฒฝ์ฐ์ -๋ฐฉํฅ์ผ๋ก ์ค์ ํ๋ฉด ๋์, y์ถ๋ ๋ง์ฐฌ๊ฐ์ง์์
๋ ์ฌ๊ฐํ์ด ๊ฐ๊ฐ์ ์ถ์์ ๊ฒน์น๋ ๊ธธ์ด๋, x์ถ์ด๋ผ๋ฉด x์ถ์ ๊ฐ ์ฌ๊ฐํ์ ๊ฐ์ฅ์๋ฆฌ๊น์ง์ ๊ธธ์ด์ ํฉ์ธ rx1+rx2์์ ์ค์ฌ์ ์ฌ์ด์ ๊ฑฐ๋ฆฌ์ธ x2-x1์ ์ ๋๊ฐ์ ๋นผ๋ฉด ๋์
y์ถ๋ ๋ง์ฐฌ๊ฐ์ง์์ ry1+ry2์์ y2-y1์ ์ ๋๊ฐ์ ๋นผ๋ฉด ๋์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def aabb_collision(x1,y1,rx1,ry1,x2,y2,rx2,ry2)
#1
dx, dy = (x2-x1).abs, (y2-y1).abs
if dx >= rx1+rx2 || dy >= ry1+ry2
return nil, nil
end
#2
dx, dy = rx1+rx2-dx, ry1+ry2-dy
if dx <= dy
if x2 > x1
return dx,0
else
return -dx,0
end
end
#3
if dy <= dx
if y2 > y1
return 0,dy
else
return 0,-dy
end
end
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ AABB์ถฉ๋์ฒดํฌ์ ์ฝ๋์์, ์์ ๊ทธ๋ฆผ์ ๋์์๋๋๋ก x1,y1,rx1,ry1,x2,y2,rx2,ry2๋ฅผ ์ ๋ ฅํ๋ฉด
๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ์ง ์๋๋ค๋ฉด nil์ ์ถ๋ ฅํ๊ณ
๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ๋ค๋ฉด 2๋ฒ ์ฌ๊ฐํ์ 1๋ฒ ์ฌ๊ฐํ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๋ ๋ฐฉํฅ์ ์ถฉ๋๋ฒกํฐ๋ฅผ ์ถ๋ ฅํด์ค์
#1์ด ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ๋์ง์ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ๋ถ๋ถ์ด๊ณ
#2๋ ๋ง์ฝ x์ถ์ ๊ฒน์น๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์๋ค๋ฉด ์ํ๋ ๋ฐฉํฅ์ ๋ฐ๋ผ์ ๊ฐ์ +ํน์ -๋ก ์ถ๋ ฅํด์ฃผ๋ ๋ถ๋ถ
#3์ y์ถ์ ๊ฒน์น๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์์๊ฒฝ์ฐ์ ์ํ๋ ๋ฐฉํฅ์ ๋ฐ๋ผ์ ๊ฐ์ +๋ -๋ก ์ถ๋ ฅํด์ฃผ๋ ๋ถ๋ถ์ด์์
์์ ์ฌ๋ ค๋์ ์์์ ์ ์ถฉ๋์ฒดํฌ์ AABB์ถฉ๋์ฒดํฌ๋ฅผ ์ฌ์ฉํด์ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ ์์์ด์์, ์์์ ์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ๊ฐ ์ ์ถฉ๋์ฒดํฌ๊ณ , ์ธ๋ฒ์งธ์ ๋ค๋ฒ์งธ๊ฐ AABB์ถฉ๋์ฒดํฌ์์
๋ชจ๋ ์ค๋ธ์ ํธ-ํ๋ ์ด์ด ์์๋ก ์ถฉ๋์ฒดํฌ๋ฅผ ํด์, ํ๋ ์ด์ด๋ฅผ ์ค๋ธ์ ํธ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๋ ์ถฉ๋๋ฒกํฐ๋ฅผ ๊ตฌํ๋ค์
์ค๋ธ์ ํธ๊ฐ ๊ณ ์ ๋์ด ์๋ ๊ฒฝ์ฐ์๋ ํ๋ ์ด์ด๋ง ํด๋น ์ถฉ๋๋ฒกํฐ๋งํผ ๋ฐ์ด๋ด๋ ๋ฐฉ์์ด๊ณ
์ค๋ธ์ ํธ๊ฐ ๋ฐ๋ ค๋๋ ๊ฒฝ์ฐ์๋ ํ๋ ์ด์ด๋ฅผ ํด๋น ์ถฉ๋๋ฒกํฐ๋งํผ ๋ฐ์ด๋ด๋ฉด์, ๋์์ ์ค๋ธ์ ํธ๋ ํด๋น ์ถฉ๋๋ฒกํฐ์ ๋ฐ๋๋ฐฉํฅ์ผ๋ก ์ถฉ๋๋ฒกํฐ์ 0.2๋ฐฐ๋งํผ ๋ฐ๋ ค๋๊ฒ ์ค์ ํ๊ฑฐ์์
์ด๋ ๊ฒํ๋ฉด ๋ฌด๊ฒ๊ฐ ์์ด์ ์ ๋ฐ๋ ค๋์ง ์๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ ์์ด์
๋นจ๋ฆฌ์ด๋ค!
์ ์ ๋ ํ ์์๋๊ฒ ๋์์ด์
์ ๊ณต๋ถํด๋ณผ๊ฒ ๊ณ ๋ง์