ยท GJK-EPA ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ ๋ง๋ค๊ธฐ
ยท ๋ถ๋ฆฌ์ถ(SAT)์ถฉ๋๊ฒ์ฌ๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ ๋ง๋ค๊ธฐ
OBB ์ถฉ๋๊ฒ์ฌ๋ฅผ ์ฌ์ฉํด์ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ธ์ด์์,
๊ทธ๋ฆฌ๊ณ ์ ๋ ์ํ์ด๋ ํ๋ก๊ทธ๋๋ฐ์ ์ ์๋๊ฒ ์๋๊ณ ์ ๊ฐ ์ดํดํ ๋ฒ์ ์์์ ์ฐ๋ ๊ธ์ด๋ผ ํ๋ฆฌ๊ฑฐ๋ ์๋ชป๋ ๋ด์ฉ์ด ์์์๋ ์์ด์
๊ทธ๋ฆฌ๊ณ ์ด ๊ธ์ ์์ ์ฌ๋ ค๋์ ์๋ฆฌ์ฆ์์ย ๋ถ๋ฆฌ์ถ(SAT)์ถฉ๋๊ฒ์ฌ์์ ์ด์ด์ง๋ ๋ด์ฉ์ ๊ธ์ด์์,
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
1. OBB์ถฉ๋๊ฒ์ฌ์ ์๋ฆฌ
OBB์ถฉ๋๊ฒ์ฌ๋ ๋ถ๋ฆฌ์ถ(SAT)์ถฉ๋๊ฒ์ฌ๋ฅผ ๋ ์ง์ฌ๊ฐํ์ ์ถฉ๋์ ๊ฒฝ์ฐ๋ก ๋จ์ํ์์ผ ๋์ ์ถฉ๋๊ฒ์ฌ์์
์ด๋ ๋ ์ง์ฌ๊ฐํ์ ๊ธฐ์ธ์ด์ ธ ์์ด๋ ์๊ด์์ด์,ย
SAT์ถฉ๋๊ฒ์ฌ๋ ์๋ ๊ฐ ๋ค๊ฐํ์ ๋ชจ๋ ๋ชจ์๋ฆฌ์ ์์ง์ธ ๋ฒกํฐ์ ๋ํด์ ๋ํ์ ํฌ์์์ญ์ ์ฒดํฌํ์ง๋ง
์ถฉ๋ํ๋ ๋ค๊ฐํ์ ๋ ์ง์ฌ๊ฐํ์ผ๋ก ์ ํํ๋ฉด, ์ฌ๊ฐํ์ ๋ ๋ชจ์๋ฆฌ๊ฐ ํํํด์, ๊ฒฐ๊ตญ ์์ ์ฌ๋ ค๋์ ๊ทธ๋ฆผ์ฒ๋ผ ํํํ ํ ์์ ๋ชจ์๋ฆฌ์ ์์ง์ธ ๋ฒกํฐ๋ ๋์ผํ๋๊น
๋ํ์ ํฌ์์์ญ์ ์ฒดํฌํด์ผ ํ๋ ๋ฒกํฐ๋ฅผ ์ด 4๊ฐ(ํ ์ฌ๊ฐํ์ 2๊ฐ์ฉ)์ผ๋ก ๋จ์ํ์ํฌ์ ์์ด์,
๊ทธ๋ฆฌ๊ณ OBB์ถฉ๋์ฒดํฌ์์๋, SAT์ ๊ฒฝ์ฐ์ ๋ค๋ฅด๊ฒ ์ฌ๊ฐํ์ ๊ฐ ๊ผญ์ง์ ์ ์ขํ๊ฐ ์๋๋ผ, ์ค์ฌ์ ์ ์ขํ์, ์ค์ฌ์ ์์ ์๋ก ์์ง์ธ 2๊ฐ์ย ๋ชจ์๋ฆฌ๊น์ง์ ๋ฒกํฐ 2๊ฐ๋ก(์์ ๊ทธ๋ฆผ์์ ํ๋์๊ณผ ์ฃผํฉ์ ๋ฒกํฐ) ์ ์ฅํด๋์์
๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ ๋ฒกํฐ๋, ๊ฒฐ๊ตญ ์๋ก๊ฐ ์๋ก์ ๋ํด์ ์์ง์ธ ๋ฒกํฐ๋๊น, ๋ถ๋ฆฌ์ถ(SAT)์ถฉ๋๊ฒ์ฌ์์ ์ฒ๋ผ ๋ฐ๋ก ๊ผญ์ง์ ์ ์ขํ๋ฅผ ํตํด์ ๋ฒกํฐ๋ฅผ ๋ง๋ค์ง ์๊ณ
์ด ๋ ๋ฒกํฐ๋ฅผ ๊ทธ๋๋ก ๊ฐ์ ธ์์ ๋ํ์ ํฌ์์์ญ์ ๊ฒ์ฌํ ๋ฒกํฐ๋ก ์ฌ์ฉํ ์ ์์ด์
๊ทธ๋ฆฌ๊ณ ์ด๋ ๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น๋์ง๋ฅผ ์ฒดํฌํ๋ ๋ฐฉ๋ฒ๋
SAT์ถฉ๋๊ฒ์ฌ์์์ฒ๋ผ ๋ํ์ ์ ์ฒด ํฌ์์์ญ์ ์ฒดํฌํ์ง ์๊ณ
๊ฐ๊ฐ์ ์ฌ๊ฐํ๋ค์ ์ค์ฌ์ ์์๋ถํฐ, ํ์ชฝ ๊ฐ์ฅ์๋ฆฌ๊น์ง๋ฅผ ํฌ์์ํจ ๊ธธ์ด์
๋ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ ์ด์ด์ ๋ง๋ ๋ฒกํฐ๋ฅผ ํฌ์์ํจ ๊ธธ์ด๋ฅผ ๋น๊ตํ๋๊ฑธ๋ก ๋จ์ํ ์ํฌ์ ์์ด์
์์ ๊ทธ๋ฆผ์์ ํ๋์๊ณผ ์ฃผํฉ์์ด ๊ฐ๊ฐ์ ์ฌ๊ฐํ์ ์ค์ฌ์ ๋ถํฐ ํ์ชฝ ๊ฐ์ฅ์๋ฆฌ๊น์ง๋ฅผ ์๋์ ๋ฒกํฐ์ ํฌ์์ํจ ๊ธธ์ด์์
๊ทธ๋ฆฌ๊ณ ๋ณด๋ผ์์ด ๋ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ ์ด์ ๋ฒกํฐ๋ฅผ ์๋์ ํฌ์์ํจ ๊ธธ์ด์์
๊ทธ๋ฆฌ๊ณ ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์ฒ๋ผ ๋ณด๋ผ์ ๊ธธ์ด๊ฐ ํ๋์๊ณผ ์ฃผํฉ์ ๊ธธ์ด์ ํฉ๋ณด๋ค ํฌ๋ฉด, ๋ ์ฌ๊ฐํ์ ์ถฉ๋ํ์ง ์์๊ฑฐ์์, ์ฆ ํฌ์์์ญ์ด ๊ฒน์น์ง ์์๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ๋๋ฒ์งธ ๊ทธ๋ฆผ์ฒ๋ผ, ๋ณด๋ผ์ ๊ธธ์ด๊ฐ ํ๋์๊ณผ ์ฃผํฉ์ ๊ธธ์ด์ ํฉ๋ณด๋ค ์์ผ๋ฉด, ๋ ์ฌ๊ฐํ์ ์ถฉ๋ํ๊ฑฐ์์, ์ฆ ํฌ์์์ญ์ด ๊ฒน์น๋๊ฑฐ์์
OBB์ถฉ๋๊ฒ์ฌ์์๋ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ ์ขํ์, ์ค์ฌ์ ์์ ์ฌ๊ฐํ์ ์๋ก ์์ง์ธ ๋ชจ์๋ฆฌ๊น์ง์ 2๊ฐ์ ๋ฒกํฐ๋ก ์ ์ฅํด์, ์์ ๊ทธ๋ฆผ์์ ํ๋์๊ณผ ์ฃผํฉ์ ๋ฒกํฐ์์
๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ผ๋ก๋ถํฐ ํ์ชฝ ๊ฐ์ฅ์๋ฆฌ๊น์ง๋ฅผ ํฌ์ํ ๊ธธ์ด๋, ์ด ๋๊ฐ์ ๋ฒกํฐ๋ฅผ ์๋์ ๋ฒกํฐ์ ํฌ์ํ ๊ธธ์ด์ ํฉ์ผ๋ก ๊ตฌํ ์ ์์ด์
์์ ๊ทธ๋ฆผ์์ ๋ณด๋ผ์ ๋ฒกํฐ๋ฅผ ํฌ์ํ ๊ธธ์ด๋, ์ฃผํฉ์ ๋ฒกํฐ๋ฅผ ํฌ์์ํจ ๊ธธ์ด์ ๋๊ฐ์์,
๊ทธ๋ฆฌ๊ณ ํ๋์๊ณผ ๋ณด๋ผ์ ๋ฒกํฐ๋ฅผ ํฌ์ํ ๊ธธ์ด๋ฅผ ํฉํ๋ฉด, ์ฌ๊ฐํ์ ์ค์ฌ์ ์์ ํ์ชฝ ๊ฐ์ฅ์๋ฆฌ๊น์ง๋ฅผ ํฌ์์ํจ ๊ธธ์ด์ธ ์ด๋ก์ ๊ธธ์ด๊ฐ ๋์์
๊ทธ๋ฆฌ๊ณ ์ฌ๊ฐํ์ ๋ ์ค์ฌ์ ์ ์ด์ ๋ฒกํฐ๋ฅผ ํฌ์ํย ๊ธธ์ด๋ ์์ ๊ทธ๋ฆผ์ ๋์์๋๊ฒ์ฒ๋ผ, ์ฌ๊ฐํ์ ๋ ์ค์ฌ์ ์ค ํ๋๋ฅผ ๋ค๋ฅธ ํ๋์์ ๋นผ์, ๋ ์ค์ฌ์ ์ ์ด์ด์ฃผ๋ ๋ฒกํฐ๋ฅผ ์ป์๋ค์ย ๊ทธ ๋ฒกํฐ๋ฅผ ์๋์ ๋ฒกํฐ์ ํฌ์์์ผ์ ์ป์์ ์์ด์,ย
2. OBB์ถฉ๋๊ฒ์ฌ์์์ ์ต์์ด๋๋ฒกํฐ(MTV)
OBB์ถฉ๋๊ฒ์ฌ์์ MTV๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋, ์ฒซ๋ฒ์งธ๋ก ๋ ์ฌ๊ฐํ์ ํฌ์ํ๋ ๋ฒกํฐ์ ๋ฐฉํฅ์ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ์ค์ ํด์ผํด์,
์ฐ์ ๋ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ ์ด์ด์ฃผ๋ ๋ฒกํฐ๋ฅผ ์ป์๋, ์ํ๋ ๋ฐฉํฅ์ด ๋๋๋ก ๋ฒกํฐ๋ฅผ ๊ตฌํด์, ์ฌ๊ธฐ์๋ ํ๋์ ์ฌ๊ฐํ์ ์ฃผํฉ์ ์ฌ๊ฐํ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๋ ๋ฐฉํฅ์ MTV๋ฅผ ์ป๊ธฐ ์ํด์, ์ฃผํฉ์ ์ฌ๊ฐํ์ ์ค์ฌ์ ์์ ํ๋์ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ผ๋ก ํฅํ๋ ๋ฐฉํฅ์ผ๋ก ๋ฒกํฐ๋ฅผ ๊ตฌํ์ด์, ์ฆ ํ๋ ์ฌ๊ฐํ์ ์ค์ฌ์ ์์ ์ฃผํฉ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ ๋นผ๋ ๋ฐฉํฅ์ด์์
๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฒ์ ์ ๋ฒกํฐ, ์ฆ ๋ ์ฌ๊ฐํ์ ํฌ์ํ๋ ๋ฒกํฐ์ ์ด๋ ๊ฒ ์ป์ด์ง ๋ฒกํฐ๋ฅผ ๋ด์ ํด์ ๋ฐฉํฅ์ ๋น๊ตํ๋ค์, ๋ง์ฝ ์๋์ ๋ฒกํฐ์ ๋ฐฉํฅ์ด ์์์ ์ป์ ๋ฒกํฐ(์ด๋ก์)์ ๋ฐฉํฅ์ด ๋ฐ๋๋ผ๋ฉด
์๋์ ๊ฒ์ ์ ๋ฒกํฐ์ ๋ฐฉํฅ์ ๋ฐ๋๋ฐฉํฅ์ผ๋ก(x,y๋ผ๋ฉด -x,-y)๋ฐ๊ฟ์ค์, ์ด๋ ๊ฒํ๋ฉด ๋ ์ฌ๊ฐํ์ ํฌ์ํ๋ ๋ฒกํฐ๋ฅผ ์ํ๋ ๋ฐฉํฅ์ผ๋ก ์ค์ ํ ์ ์์ด์
์์ ๊ทธ๋ฆผ์ ๋ ๋ฒกํฐ์ ๋ด์ ๊ฐ์ ํตํด์ ๋ ๋ฒกํฐ์ ๋ฐฉํฅ์ ๋น๊ตํ๋ ๊ทธ๋ฆผ์ด์์, ๋ ๋ฒกํฐ๋ฅผ ๋ด์ ํ ๊ฐ์ด 0๋ณด๋ค ์์ผ๋ฉด ๋ ๋ฒกํฐ๊ฐ ์๋ก ๋ฐ๋๋ฐฉํฅ์ด๋ผ๋ ๋ป์ด์์, ์ฆ ๋ด์ ๊ฐ์ด 0๋ณด๋ค ์๊ฒ ๋์ค๋ฉด, ํด๋น ๋ฒกํฐ์ x,y๋ถํธ๋ฅผ ๋ฐ๊ฟ์ ๋ฐ๋ ๋ฐฉํฅ์ ๋ฒกํฐ๋ก ๋ง๋ค์ด์ฃผ๋ฉด ๋์
๊ทธ๋ฆฌ๊ณ OBB์ถฉ๋๊ฒ์ฌ์์ ์ต์์ด๋๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋, ๋ง์ฝ ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น ๊ฒฝ์ฐ, ์ฆ ์ค์ฌ์ ์ ์ด์ ๊ธธ์ด๊ฐ, ์ ์ฌ๊ฐํ์ ์ค์ฌ์ ๋ถํฐ ํ์ชฝ ๊ฐ์ฅ์๋ฆฌ๊น์ง์ ๊ธธ์ด๋ฅผ ํฉํ ๊ธธ์ด๋ณด๋ค ์์๊ฒฝ์ฐ์,
๋ ์ฌ๊ฐํ์ ์ค์ฌ์ ๋ถํฐ ํ์ชฝ ๊ฐ์ฅ์๋ฆฌ๊น์ง์ ๊ธธ์ด(์์ ๊ทธ๋ฆผ์์ ์ฃผํฉ์๊ณผ ํ๋์)๋ฅผ ํฉํ ๊ฐ์์ ๋ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ฌ์ด์ ๊ธธ์ด(์์ ๊ทธ๋ฆผ์์ ๋ณด๋ผ์)์ ๋นผ๋ฉด ๋์
๊ทธ๋ฌ๋ฉด ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ ๊ธธ์ด, ์ฆ ์ฃผํฉ์๊ณผ ํ๋์์ด ๊ฒน์น๋ ๊ธธ์ด๊ฐ ๋์์, ์ด๊ฒ ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ์๋์ MTV์ ๊ธธ์ด์์
์ฆ, ์ด๋ ๊ฒ ๊ตฌํ ํฌ์์์ญ์ด ๊ฒน์น๋ ๊ธธ์ด๊ฐ ์ ์ผ ์์ ๋์, ๊ทธ๋ ๋ ์ฌ๊ฐํ์ ํฌ์ํ ๋ฒกํฐ(์์์ ์ค๋ช ํ๋๋ก ์ํ๋ ๋ฐฉํฅ์ผ๋ก ์ค์ ๋ ๋ฒกํฐ์์)์ ๋ฐฉํฅ์ผ๋ก์ ํด๋น ๊ธธ์ด๋งํผ์ ๋ฒกํฐ๊ฐ ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ์๋์ MTV๊ฐ ๋๋๊ฑฐ์์
3. ์ฃผ์ด์ง ๋ฒกํฐ์์ ๋ ์ฌ๊ฐํ์ ์ถฉ๋์ฌ๋ถ ์ฒดํฌํ๊ธฐ : obb1ํจ์
์ฌ๊ธฐ์๋ถํฐ๋ OBB์ถฉ๋์ฒดํฌ์์, ํ ๋ฒกํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์ ๋ ์ฌ๊ฐํ์ ์ถฉ๋์ฌ๋ถ๋ฅผ ์ฒดํฌํ๋ ๊ณผ์ ์ ๋ํ ์ค๋ช ์ด์์
๊ทธ๋ฆฌ๊ณ ์ต์ข ์ ์ผ๋ก๋ ์ด๋ฌํ ์ฒดํฌ๋ฅผ ํ ์ฌ๊ฐํ์ 2๊ฐ์ฉ ์ด 4๋ฒ ๋ฐ๋ณตํ๊ฒ ๋์
#1 ๊ณผ์ ์ ์ฃผ์ด์ง ๋ฒกํฐ๋ฅผ ๋จ์๋ฒกํฐ๋ก ์ ๊ทํํ ๋ค์์, ํด๋น ๋ฒกํฐ์ ๋ฐฉํฅ์ด ๊ตฌํ๊ณ ์ ํ๋ MTV์ ๋ฐฉํฅ(ํ๋์ ์ฌ๊ฐํ์ ์ฃผํฉ์ ์ฌ๊ฐํ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๋ ๋ฐฉํฅ)๊ณผ ๊ฐ์์ง ์ฒดํฌํ๋๊ฑฐ์์,
๊ทธ๋ฆฌ๊ณ ๋ง์ฝ ๊ทธ๋ ์ง ์๋ค๋ฉด ํด๋น ๋ฒกํฐ์ ๋ฐฉํฅ์ ์ ๋ฐ๋๋ก ๋ฐ๊ฟ์ค์
#2๊ณผ์ ์์๋ย ๊ทธ๋ ๊ฒ ์ ๊ทํํ ๋จ์๋ฒกํฐ์ ๋ ์ฌ๊ฐํ์ ์ค์ฌ์ ์ ์ด์ด์ฃผ๋ ๋ฒกํฐ๋ฅผ ํฌ์ํด์ ๊ทธ ์ ๋๊ฐ์ธ ์ฒซ๋ฒ์งธ ๊ธธ์ด๋ฅผ ์ป๊ณ
์ด 4๊ฐ์ ๊ฐ ์ฌ๊ฐํ์ ์ ์ฅํ์๋์ ๋ฒกํฐ(์ค์ฌ์ ์์ ์๋ก ์์ง์ธ ๋ ๋ชจ์๋ฆฌ๊น์ง์ ๋ฒกํฐ)๋ฅผ ๊ฐ๊ฐ ํฌ์ํด์ ๊ทธ ์ ๋๊ฐ์ ๊ตฌํ๋ค์
๊ทธ๋ ๊ฒ ์ป์ด์ง 4๊ฐ์ ์ ๋๊ฐ์ ๋ชจ๋ ํฉ์ณ์ ๋๋ฒ์งธ ๊ธธ์ด๋ฅผ ์ป์ด์
#3 ๊ณผ์ ์, ์ด๋ ์ฒซ๋ฒ์งธ ๊ธธ์ด๊ฐ ๋๋ฒ์งธ ๊ธธ์ด๋ณด๋ค ํฌ๋ค๋ฉด, ์ฆ ์ค์ฌ์ ์ฌ์ด์ ํฌ์๊ธธ์ด๊ฐ, ๊ฐ ์ฌ๊ฐํ์ ์ค์ฌ์ ์์ ํ์ชฝ ๊ฐ์ฅ์๋ฆฌ๊น์ง์ ํฌ์๊ธธ์ด๋ฅผ ํฉํ ๊ฐ๋ณด๋ค ๊ธธ๋ค๋ฉด
๋ ์ฌ๊ฐํ์ ์ถฉ๋ํ์ง ์์๋ค๋๊ฑฐ๋๊น nil์ ์ถ๋ ฅํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์
#4 ๊ณผ์ ์, ์ด๋ ๋ง์ฝ ์ฒซ๋ฒ์งธ ๊ธธ์ด๊ฐ ๋๋ฒ์งธ ๊ธธ์ด๋ณด๋ค ์งง๋ค๋ฉด
๋ ์ฌ๊ฐํ์ ์ถฉ๋ํ๋ค๋๊ฑฐ๋๊น, ๊ทธ๋์ ๋ ์ฌ๊ฐํ์ ํฌ์ํ ๋ฒกํฐ์, ๋ ๊ธธ์ด๊ฐ ๊ฒน์น๋ ๊ฐ(๋๋ฒ์งธ ๊ธธ์ด์์ ์ฒซ๋ฒ์งธ ๊ธธ์ด๋ฅผ ๋บ ๊ฐ)์ ์ถ๋ ฅํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def obb1(vx,vy,p1,p2)
cx1,cy1,x1,y1,x2,y2,cx2,cy2,x3,y3,x4,y4 = p1[0],p1[1],p1[2],p1[3],p1[4],p1[5],p2[0],p2[1],p2[2],p2[3],p2[4],p2[5]
#1
vx,vy = vx/((vx**2+vy**2)**0.5), vy/((vx**2+vy**2)**0.5)
if (cx2-cx1)*vx+(cy2-cy1)*vy < 0
vx, vy = -vx, -vy
end
#2
d1 = ((cx2-cx1)*vx+(cy2-cy1)*vy).abs
d2 = (x1*vx+y1*vy).abs+(x2*vx+y2*vy).abs+(x3*vx+y3*vy).abs+(x4*vx+y4*vy).abs
#3
if d1 >= d2
return nil, nil, nil
end
#4
if d1 < d2
return vx, vy, d2-d1
end
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์์ ํจ์์ ์ฝ๋์์, rubyํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ์์ฑํ๊ฑฐ์์ ์ด๋ก์ #๋ก ์ ๋ ฅํด๋์ ์ฃผ์์ด ์์ ์ค๋ช ์์ ํด๋นํ๋ ๊ณผ์ ์ด์์
p1๊ณผ p2๋ย [cx,cy,x1,y1,x2,y2] ํ์์ ๋ฐฐ์ด๋กย ์ฌ๊ฐํ์ ์ ๋ ฅํ๊ฑฐ์์ cx, cy๊ฐ ์ค์ฌ์ ์ ์ขํ๊ณ , x1,y1 x2,y2๊ฐ ์ค์ฌ์ ์ผ๋ก๋ถํฐ ์๋ก ์์ง์ธ ์ฌ๊ฐํ์ ๊ฐ ๋ชจ์๋ฆฌ๊น์ง์ ๋ฒกํฐ์์
๊ทธ๋ฆฌ๊ณ ์ ๋ ฅ๊ฐ์ vx, vy๋ ์ถฉ๋์ ๊ฒ์ฌํ๊ณ ์ ํ๋ ๋ฒกํฐ์์,
์ด๋ ๊ฒ ์ ๋ ฅํ๋ฉด, ๋ง์ฝ ํด๋น ๋ฒกํฐ์์ ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ์ง ์์๋ค๋ฉด nil์ด ์ถ๋ ฅ๋๊ณ ,
๋ง์ฝ ์ถฉ๋ํ๋ค๋ฉด, p1์์ p2๋ก ํฅํ๋ ๋ฐฉํฅ์ผ๋ก ํด๋น ๋ฒกํฐ๋ฅผ ์ ๊ทํํ ๋จ์๋ฒกํฐ์, ๊ทธ๋์ ๋ ๋ํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ ๊ธธ์ด๊ฐ ์ถ๋ ฅ๋์,
4. OBB์ถฉ๋์ฒดํฌ์ ์๋๊ณผ์
์ฌ๊ธฐ์๋ถํฐ๋ ๋ฐฉ๊ธ ์ค๋ช
ํ ํจ์๋ฅผ ์ฌ์ฉํด์, ์ค์ ๋ก OBB์ถฉ๋์ฒดํฌ๋ฅผ ์งํํ๋ ๊ณผ์ ์ ๋ํ ์ค๋ช
์ด์์
#1๊ณผ์ ์ ์ ๋ ฅ๋ ๋ ์ฌ๊ฐํ์ผ๋ก๋ถํฐ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋์ง ์ฒดํฌํ ย 4๊ฐ์ ๋ฒกํฐ๋ฅผ ์ป์ด์,
๊ทธ๋ฆฌ๊ณ #2 ๊ณผ์ ์ ๊ทธ์ค ํ๊ฐ์ง ๋ฒกํฐ์ ๋ํด์, ์์์ ์ค๋ช ํ obb1ํจ์๋ก ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋์ง๋ฅผ ์ฒดํฌํด์
#3 ๊ณผ์ ์ ๋ง์ฝ ์ด๋ ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ์์ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฒน์น์ง ์๋๋ค๋ฉด,
๋ ์ฌ๊ฐํ์ ์ถฉ๋ํ์ง ์์๋ค๊ณ ํ์ ํ๊ณ nil์ ์ถ๋ ฅํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์
#4 ๊ณผ์ ์ ์ด๋ ๋ง์ฝ ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ค๋ฉด
๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ๋ค๊ณ ํ์ ํ๊ณ , ์ด๋์ ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ ๊ธธ์ด์ ํด๋น ๋ฒกํฐ๋ฅผ ์ ์ฅํด๋์์
๊ทธ๋ฆฌ๊ณ ๋ค์ ๋ฒกํฐ๋ฅผ ๊ณจ๋ผ์ ๋ค์ #2 ๊ณผ์ ๋ถํฐ ํจ์๋ฅผ ๋ฐ๋ณตํด์
ํจ์๋ฅผ ๋ฐ๋ณตํ๋ฉด์ ๋ง์ฝ ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น์ง ์๋๋ค๋ฉด ๋ ์ฌ๊ฐํ์ ์ถฉ๋ํ์ง ์์๋ค๊ณ ํ์ ํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํ๊ณ
๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ค๋ฉด, ๊ทธ ๊ฐ์ ๊ธฐ์กด์ ์ ์ฅํ๋ ๊ฐ๊ณผ ๋น๊ตํด์, ๋ ๊ฐ์ด ์์ ๊ธธ์ด์ ๊ทธ๋์ย ๋ฒกํฐ๋ฅผ ์ ์ฅํด์
๊ทธ๋ฆฌ๊ณ ์ด๋ฐ์์ผ๋ก ํจ์๋ฅผ ๋ฐ๋ณตํ๋ฉด, ๋ง์ฝ ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ์ง ์๋๋ค๋ฉด ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น์ง ์๋ย ๋ฒกํฐ๋ฅผ ์ฐพ์์ ๋์ค์ ํจ์๊ฐ ์ข ๋ฃ๋๊ณ
๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ๋ค๋ฉด, ์ต์ข ์ ์ผ๋ก ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ ๊ธธ์ด๊ฐ ์ ์ผ ์์ ๋จ์๋ฒกํฐ์, ๊ทธ๋์ ๋ ์ฌ๊ฐํ์ ํฌ์์์ญ์ด ๊ฒน์น๋ ๊ธธ์ด๋ฅผ ์ป์์ ์์ด์
๊ทธ๋ฆฌ๊ณ ๊ทธ๋์ ๋จ์๋ฒกํฐ์ ํด๋น ๊ธธ์ด๋ฅผ ๊ณฑํ ๊ฐ์ ์ถ๋ ฅํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํด์, ์ด๋ ๊ฒ ์ถ๋ ฅ๋ ๊ฐ์ด ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ์๋์ ์ํ๋ ๋ฐฉํฅ์ผ๋ก์ MTV๊ฐ ๋๋๊ฑฐ์์
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
def obb_collision(p1,p2)
cx1,cy1,x1,y1,x2,y2,cx2,cy2,x3,y3,x4,y4 = p1[0],p1[1],p1[2],p1[3],p1[4],p1[5],p2[0],p2[1],p2[2],p2[3],p2[4],p2[5]
#1
a = Array.new
a.push([x1,y1])
a.push([x2,y2])
a.push([x3,y3])
a.push([x4,y4])
#2
d2 = nil
i = 0
until a[i] == nil
x, y = a[i][0],a[i][1]
vx, vy, d = obb1(x,y,p1,p2)
#3
if d == nil
return nil, nil
end
#4
if d2 == nil || d < d2
vx2, vy2, d2 = vx, vy, d
end
i+=1
end
return vx2*d2, vy2*d2
end
ใ กใ กใ กใ กใ กใ กใ กใ กใ กใ ก
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์์ ํจ์์ ์ฝ๋์์, ์ด๋ก์ #๋ก ๋ฌ์๋์ ์ฃผ์์ด ํด๋น ๊ณผ์ ์ ์ค๋ช ์ด์์
์ ๋ ฅ๊ฐ์ p1๊ณผ p2๋ ์์์ ์ค๋ช ํ๋๋กย [cx,cy,x1,y1,x2,y2]ย ํ์์ ๋ฐฐ์ด๋ก ์ ๋ ฅํ ๋ ์ฌ๊ฐํ์ด์์,
๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ์ ๋ ฅํ๋ฉด ์ต์ข ์ ์ผ๋ก ๋ ์ฌ๊ฐํ์ด ์ถฉ๋ํ์ง ์๋๋ค๋ฉด nil์ด ์ถ๋ ฅ๋๊ณ
๋ง์ฝ ์ถฉ๋ํ๋ค๋ฉด, p2๋ฅผ p1๋ฐ์ผ๋ก ๋ฐ์ด๋ด๋ ๋ฐฉํฅ์ผ๋ก์ ์ต์์ด๋๋ฒกํฐ(MTV)๊ฐ ์ถ๋ ฅ๋์
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์์์ ์ค๋ช ํ OBB์ถฉ๋์ฒดํฌ๋ฅผ ์ด์ฉํด์ ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ ๊ฑฐ์์, ํ๋์ ์ฌ๊ฐํ์ด ๋ฐฉํฅํค๋ก ์์ง์ด๋ ํ๋ ์ด์ด์์
์์์ ์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ๋, ์ค๋ธ์ ํธ-ํ๋ ์ด์ด ์์๋ก ์ถฉ๋์ฒดํฌ๋ฅผ ํด์, ํ๋ ์ด์ด๋ฅผ ์ค๋ธ์ ํธ ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๋ ๋ฐฉํฅ์ MTV๋ฅผ ๊ตฌํด์ ์ถฉ๋ํ์๋ ํ๋ ์ด์ด๋ฅผ ํด๋น ๋ฒกํฐ๋งํผ ์ด๋์ํค๋๊ฑฐ์์
๊ทธ๋ฆฌ๊ณ ์ธ๋ฒ์งธ์ ๋ค๋ฒ์งธ๋, ํ๋ ์ด์ด-์ค๋ธ์ ํธ ์์๋ก ์ถฉ๋์ฒดํฌ๋ฅผ ํด์, ์ค๋ธ์ ํธ๋ฅผ ํ๋ ์ด์ด ๋ฐ์ผ๋ก ๋ฐ์ด๋ด๋ ๋ฐฉํฅ์ MTV๋ฅผ ๊ตฌํ๋ค์, ์ถฉ๋ํ์๋ ์ค๋ธ์ ํธ๋ฅผ ํด๋น ๋ฒกํฐ๋งํผ ๋ฐ์ด๋ด๋๊ฑฐ์์
์ด๋ ๊ฒ ํ๋ฉด OBB์ถฉ๋์ฒดํฌ๋ก ํ๋ ์ด์ด๋ฅผ ๋ฐ์ด๋ด๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ ์์ด์,
๋งค๋ฒ ๊ฐ์ฌํฉ๋๋ค
์ด๊ณ ์