728x90

sweep and prune์€ ๊ต์ˆ˜๋‹˜๊ป˜์„œ ํŠน์ • ๋…ผ๋ฌธ์„ ์ฝ์œผ๋ผ๊ณ  ํ•˜์…จ์„ ๋•Œ ๋ณธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค

ํ•˜์ง€๋งŒ ํ•œ๊ธ€ ํ•ด์„์ด ๋œ ํฌ์ŠคํŒ…์ด ์—†์–ด์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฒˆ์—ญํ•˜์—ฌ ๋†“๊ณ  ์ ์  ์ถ”๊ฐ€ ๋ฐ ๋ณด์™„ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ https://github.com/mattleibow/jitterphysics/wiki/Sweep-and-Prune ์„ ํ•œ๊ตญ์–ด๋กœ ํ•ด์„ํ•œ ํฌ์ŠคํŒ…์œผ๋กœ ๋ฌธ์ œ๊ฐ€๋  ์‹œ ์‚ญ์ œํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค

 

 

 

๊ด‘์—ญ ์ถฉ๋Œ ์‹œ์Šคํ…œ์€ ๋ชจ๋“  ๋ฌผ๋ฆฌ ์—”์ง„์˜ ํ•ต์‹ฌ ๊ณผ์ • ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ ๊ด‘์—ญ ์ถฉ๋Œ์— ๋Œ€ํ•ด ๋†“์นœ ๊ฒŒ ์žˆ๋‹ค๋ฉด ๊ด‘์—ญ ์ถฉ๋Œ์‹œ์Šคํ…œ์„ ์ตœ์ ํ™”ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์งœ์„œ ๋ณต๊ตฌํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ฆฌ ์—”์ง„์—์„œ ์ถฉ๋Œ ๋‹จ๊ณ„์—๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

1. Broadphase : ๊ด‘๋Œ€ํ•œ ๋ฒ”์œ„

- ์—ฌ๊ธฐ์„œ ์–ด๋–ค ์ถฉ๋Œ์ด ์‹ค์ œ๋กœ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ถฉ๋Œํ•  ์ˆ˜ ์—†๋Š” ์ถฉ๋Œ์„ ํ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ํ• ๋งŒํ•œ ์‚ฌ์ดํŠธ : https://developer.nvidia.com/gpugems/gpugems3/part-v-physics-simulation/chapter-32-broad-phase-collision-detection-cuda

 

Chapter 32. Broad-Phase Collision Detection with CUDA

Chapter 32. Broad-Phase Collision Detection with CUDA Scott Le Grand NVIDIA Corporation Collision detection among many 3D objects is an important component of physics simulation, computer-aided design, molecular modeling, and other applications. Most effic

developer.nvidia.com

 

2. Midphase : ์ค‘๊ฐ„ ๋ฒ”์œ„

- ๊ตฌ๋‚˜ ์ฒœ ๋ฌผ์ฒด ๊ฐ™์€ ๊ธฐํ•˜ํ•™์  ๋‹จ๊ณ„์—์„œ์˜ ์ถฉ๋Œ์„ ๋งํ•ฉ๋‹ˆ๋‹ค. 

 

3. Narrowphase : ์ข์€ ๋ฒ”์œ„

- ์ด ๋‹จ๊ณ„์—์„œ ์‹ค์ œ ์ถฉ๋Œ ๊ฐ์ง€๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.  ๊ต์ฐจ์ , ์ถฉ๋Œ ๋ฒ•์„  ๋˜๋Š” ์นจํˆฌ ๊นŠ์ด์™€ ๊ฐ™์€ ์ถฉ๋Œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ฑฐ์˜ ๋ชจ๋“  ๊ด‘์—ญ ์‹œ์Šคํ…œ์€ ๊ฐ์ฒด์˜ ์ถ• ์ •๋ ฌ๋œ ๊ฒฝ๊ณ„ ์ƒ์ž(aabb)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

aabb๋Š” ๊ฝค ๋นจ๋ฆฌ ๊ณ„์‚ฐ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ต์ฐจ์ ์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ๋„ ๋ช‡ ์ค„์˜ ์ฝ”๋“œ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

์ฐธ๊ณ ํ• ๋งŒํ•œ ์‚ฌ์ดํŠธ : https://blog.naver.com/mycode333/50031266282

 

AABB์™€ AABB ์ถฉ๋Œ

AABB( Axis Aligned Bounding Box)๋Š” ์ถ•์— ์ •๋ ฌ๋œ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ•์Šค๊ฐ€ ํšŒ์ „ํ•˜์ง€ ์•Š๊ณ  ์ถ• ๋ฐฉํ–ฅ...

blog.naver.com

 

๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด "๊ฒน์น˜์ง€ ์•Š๋Š” ์Œ์˜ ์ •๋ ฌ ๊ณผ์ •"์„ ๊ฐ€์†ํ™” ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ถฉ๋Œ์„ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ „์˜ ์ ‘๊ทผ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

for (int i = 0; I < rigidBodies.Count; i++)
{
    for (int e = i; e < rigidBodies.Count; e++)
    {
        if (CheckBoundingBoxForOverlap(i, e))
            DetectNarrowPhase(i,e);
    }
}

 

๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ์ฒซ ๋ฒˆ์งธ Rigidbody๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ฒซ ๋ฒˆ์งธ Rigidbody๋ฅผ ์ œ์™ธํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ๋“ค์— ๋Œ€ํ•ด ๋‘ ๋ฒˆ์งธ Rigidbody๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

 

๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€๋Š” ์•Š์ง€๋งŒ..

๋งŒ์•ฝ 10x10x10 ์ถฉ๋Œ ๊ฐ์ง€ ๋˜๋Š” ํ๋ธŒ๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ตœ์ƒ์˜ ๊ฒฝ์šฐ ์ˆ˜์ฒœ ๊ฐœ์˜ ์ถฉ๋Œ ๊ฐ€๋Šฅํ•œ ์Œ์„ ํ™•์ธํ•˜์—ฌ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ข์€ ๋ฒ”์œ„์˜ ์ถฉ๋Œ ์ฒดํฌ๋Š” 0.25๋ฐฑ๋งŒ ๊ฐœ๋ฅผ ์ฒดํฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ž์—ฐ์ ์œผ๋กœ ๊ด‘์—ญ ๋ฒ”์œ„๋Š” O(n^2) ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š”๋ฐ ์ด์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

 

๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์†ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์›น์—์„œ "๊ด‘์—ญ์ƒ ์ถฉ๋Œ ํƒ์ง€"๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋ฉด Sweep And Prune(SAP)์ ‘๊ทผ๋ฒ•์„ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ๋ณ€ํ˜•๋œ ๊ตฌํ˜„๋“ค์ด ์žˆ์ง€๋งŒ ๋ถ„๋ฅ˜ํ•œ ๋‹ค์Œ ๋‹ค๋“ฌ๋Š”๋‹ค(Prune)๋Š” ๊ณตํ†ต์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

SAP ์•Œ๊ณ ๋ฆฌ์ฆ˜์—์„œ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ "flavor"๋ฅผ ์ง€์†๋˜์ง€ ์•Š๋Š” ๋‹จ์ผ ์ถ• SAP์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

1. ๊ณต๊ฐ„ ์•ˆ์˜ ๋ชจ๋“  ๋ฌผ์ฒด๋“ค์€ "AxisList"๋ผ๋Š” ๋ชฉ๋ก ์•ˆ์— ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„์ƒ์ž์˜ ์‹œ์ž‘์„ ์ด์šฉํ•ด ํ•œ ๊ฐœ์˜ ์ถ•(์—ฌ๊ธฐ์„œ๋Š” X์ถ•)์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌผ์ฒด 5์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์ง€์ ์ด X์ถ•์„ ์ง์ ‘ ๋ณผ ๋•Œ ๋ฌผ์ฒด 6์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์ง€์ ๋ณด๋‹ค ๋” ์™ผ์ชฝ์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

2. "ActiveList"๋ผ๋Š” ์ƒˆ๋กœ์šด ์ž„์‹œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์ž. ์ด์ œ "AxisList"์˜ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๋ณด๊ณ  "ActiveList"์˜ ๋ชจ๋“  ํ•ญ๋ชฉ๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.(ํ˜„์žฌ๋Š” ๋‹จ ํ•˜๋‚˜) ๋งŒ์•ฝ ์ƒˆ ํ•ญ๋ชฉ์˜ ์™ผ์ชฝ์ด ๋” ํฌ๋ฉด ํ˜„์žฌ "ActiveList"์˜ ์˜ค๋ฅธ์ชฝ ํ•ญ๋ชฉ์ด ์ œ๊ฑฐ๋˜๊ณ  "ActiveList"์—์„œ ํ˜„์žฌ "ActiveList" ์•„์ดํ…œ์ด ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ƒˆ "AxisList" ํ•ญ๋ชฉ๊ณผ ํ˜„์žฌ "ActiveList" ํ•ญ๋ชฉ ๊ฐ„์˜ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊น๋‹ˆ๋‹ค. ์ƒˆ ํ•ญ๋ชฉ ์ž์ฒด๋ฅผ "ActiveList"์— ์ถ”๊ฐ€ํ•˜๊ณ  "AxisList"์˜ ๋‹ค์Œ ํ•ญ๋ชฉ์„ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.

 

 

์ถœ์ฒ˜ : https://github.com/mattleibow/jitterphysics/wiki/Sweep-and-Prune

 

์ด ์ ‘๊ทผ๋ฒ•์ด ์ง€์†์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ๋ฉ๋‹ˆ๋‹ค.

์ •๋ ฌ์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ํ”„๋ ˆ์ž„์—์„œ ์ˆ˜ํ–‰๋˜๋ฉฐ(quicksort ์„ฑ๋Šฅ์ด ์ข‹๋‹ค) ํ•œ ์ถ•(์—ฌ๊ธฐ์—์„œ๋Š” X์ถ•)์— ๋Œ€ํ•ด ์ •๋ ฌ๋œ๋‹ค.

์šฐ๋ฆฌ๋Š” ์žฅ๋ฉด์˜ ์ผ๊ด€์„ฑ์„ ์ด์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.(ํ•œ ํ”„๋ ˆ์ž„์—์„œ ์žฅ๋ฉด์ด ๋งŽ์ด ๋ณ€ํ•˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋‹ค)

์†๋„ ํ–ฅ์ƒ์€ ์–ด๋””์„œ ๋ฐœ์ƒํ•˜๋Š”๊ฒƒ์ผ๊นŒ?

์ •๋‹ต์€ ์ถฉ๋Œ ํƒ์ง€๋Š” ๊ฒ€์ƒ‰ ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์ „ ๋ถ„๋ฅ˜๋œ ๋ชฉ๋ก์„ ๊ฒ€์ƒ‰์€ O(nlog(n)) ๋ณด๋‹ค ๋น ๋ฆ…๋‹ˆ๋‹ค.

์ด ์‰ฌ์šด ์ ‘๊ทผ๋ฒ•์„ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฌด์ฐจ๋ณ„ ํž˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜(brute force algorithm)์— ๋น„ํ•ด ์—„์ฒญ๋‚œ ์†๋„ ํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

JigLib (Danny Chapman์ด ๋งŒ๋“  ์ฝ”๋“œ)์—์„œ C # (JigLibX)๋กœ ์ด์‹๋˜์—ˆ์„ ๋•Œ, JigLib์˜ ์›๋ž˜ ๋ฒ„์ „์€ ๋ฌด์ฐจ๋ณ„์ ์ธ ํž˜๊ณผ ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ๊ทธ๋ฆฌ๋“œ ์ ‘๊ทผ๋ฒ•์„ ํฌํ•จํ•˜๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
์กด ์™€ํŠธ๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ฝ”๋“œ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ์ ํŠธ์— SAP ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ–ˆ๋Š”๋ฐ, ์ด๋Š” ๋ณต์žกํ•œ ๊ทธ๋ฆฌ๋“œ ์ ‘๊ทผ๋ฒ•์„ ์‰ฝ๊ฒŒ ๊ทน๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์ฝ”๋“œ๋Š” ์ด๋ฏธ ๊ฝค ์ž˜ ์ˆ˜ํ–‰๋˜์ง€๋งŒ, ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  X์ถ•์—์„œ ๋ชจ๋“  ๋ฌผ์ฒด๊ฐ€ ๊ฒน์น˜๋ฉด ๋Ÿฐํƒ€์ž„์€ ๋‹ค์‹œ O (n *2)์ด๋‹ค.

(๋”ฐ๋ผ์„œ, ๋Œ€๋ถ€๋ถ„์˜ ๋ฌผ์ฒด๊ฐ€ ๊ทธ๊ณณ์—์„œ ๊ฒน์น˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ถ„๋ฆฌ ์ถ•์œผ๋กœ up-์ถ•์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค)

 

Sweep and Prune์„ ํ•˜๊ธฐ ์œ„ํ•œ ๋” ๋ณต์žกํ•œ(๊ทธ๋ฆฌ๊ณ  ๋” ๋น ๋ฅธ) ์ ‘๊ทผ๋ฒ•์€ ์™„์ „ํ•œ 3์ถ• ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‘ ๋ฌผ์ฒด๊ฐ€ ์ถฉ๋Œํ•˜๋ฉด ์„ธ ์ถ• ๋ชจ๋‘ ๊ฒน์น˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค (๋ถ„๋ฆฌ ์ถ• ์ •๋ฆฌ).

์ง€์†์  3Axis SAP๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์š”์•ฝํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์„ธ ๊ฐœ์˜ ๋ชฉ๋ก (๊ฐ ์ถ• 1์— ๋Œ€ํ•ด)์„ ์‚ฌ์šฉํ•˜๊ณ  ์‚ฝ์ž… ์ •๋ ฌ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ๋œ ๋ชฉ๋ก์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์‚ฝ์ž… ์ •๋ ฌ์€ ๊ฑฐ์˜ ์ •๋ ฌ๋œ ๋ชฉ๋ก์—์„œ O(n)์ž…๋‹ˆ๋‹ค.

์‚ฝ์ž… ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์Šค์™‘์€ ๊ฐœ์ฒด๊ฐ€ ๋‹ค๋ฅธ ๋ณธ์ฒด์™€ ์ค‘์ฒฉ๋˜๊ธฐ ์‹œ์ž‘/์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ํ•œ ๊ฐœ์˜ ํ•ด์‹œ ํ…Œ์ด๋ธ”์„ ๊ฒน์ณ์„œ ๋ณด๊ด€ํ•˜๊ณ , ๊ฐ ํ”„๋ ˆ์ž„์€ ์‚ฝ์ž…๊ตฌ์—ญ์„ ํ•˜๊ณ , ํ•ด์‹œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ๋ณด๊ณ ๋ฐ›์Šต๋‹ˆ๋‹ค.

 

 

Jitter์˜ ์ ˆ์ฐจ

private void SortAxis(List<SweepPoint> axis)
{
    for (int j = 1; j < axis.Count; j++)
    {
        SweepPoint keyelement = axis[j];
        float key = keyelement.Value;
        
        int i = j - 1;
        
        while (i >= 0 && axis[i].Value > key)
        {
            SweepPoint swapper = axis[i];
            
            if (keyelement.Begin && !swapper.Begin)
            {
                if (CheckBoundingBoxes(swapper.Body, keyelement.Body))
                {
                    lock (fullOverlaps)
                    {
                        fullOverlaps.Add(new BroadphasePair(swapper.Body, keyelement.Body));
                    }
                }
            }
            
            if (!keyelement.Begin && swapper.Begin)
            {
                lock (fullOverlaps) 
                {
                    fullOverlaps.Remove(new BroadphasePair(swapper.Body, keyelement.Body));
                }
            }
            
            axis[i + 1] = swapper;
            i = i - 1;
        }
        axis[i + 1] = keyelement;
    }
}
 

 

๋งŒ์•ฝ ๋‹น์‹ ์ด ์ „ํ˜•์ ์ธ SAP ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ๋ชจ๋“  ์„ธ๋ถ€์‚ฌํ•ญ์— ๊ด€์‹ฌ์ด ์žˆ๋‹ค๋ฉด, ๋‚˜๋Š” ํ”ผ์—๋ฅด ํ…Œ๋ฅด๋””๋งŒ์ด ์“ด ํ›Œ๋ฅญํ•œ ๊ธฐ์‚ฌ๋ฅผ ์ฝ์„ ๊ฒƒ์„ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๊ฐ ํ”„๋ ˆ์ž„์— "A๊ฐ€ ์ถ• C์—์„œ B์™€ ๊ฒน์นœ๋‹ค"๋Š” ์ •๋ณด๋‚˜ "A๊ฐ€ ์ถ• C์—์„œ B์˜ ์ค‘์ฒฉ์„ ์ค‘์ง€ํ–ˆ๋‹ค"๋Š” ์ •๋ณด๋งŒ ์ „๋‹ฌ๋ฐ›์œผ๋ฉด X, Y ๋˜๋Š” Z์ถ•์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฒ˜์Œ ์ด๊ฒƒ์„ ์‹œํ–‰ํ–ˆ์„ ๋•Œ, ๋‚˜๋Š” ๋‚ด๊ฐ€ ๋ฐ›๋Š” ๊ฐ’์‹ผ ๊ฒฐ๊ณผ์— ๋งค์šฐ ๋งŒ์กฑํ–ˆ๊ณ , ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ ์‹ค์ˆ˜๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ๊ฐ์˜ ์Œ์ด ์–ผ๋งˆ๋‚˜ ์ค‘๋ณต๋˜๋Š”์ง€๋ฅผ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒน์น˜๋Š” ํšŸ์ˆ˜๊ฐ€ 3ํšŒ(๋ชจ๋“  ์ถ•์—์„œ ๊ฒน์น˜๋Š” ํšŸ์ˆ˜๊ฐ€ 1ํšŒ์ž„์„ ์˜๋ฏธ)์ธ ๊ฒฝ์šฐ, ๋ฌผ์ฒด๋Š” ์ถฉ๋Œํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ ๋”์ฐํ•ฉ๋‹ˆ๋‹ค.

ํ•œ ์ถ•์— ๊ฒน์น˜๋Š” ์Œ์˜ ์ˆ˜๋Š” ๋งค์šฐ ๋†’์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ค‘๋ณต ๊ณ„์ˆ˜ = 1์ธ ์ˆ˜์ฒœ ๊ฐœ์˜ ์ž ์žฌ์  ๊ฒน์น˜๋Š” ์Œ์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค. ๋‹จ์ง€ ๋ช‡ ๊ฐœ๋งŒ ๋‘ ๋ฒˆ์งธ ์ถ•์— ๊ฒน์น˜๊ณ  ๊ฒน์น˜๋Š” ํšŸ์ˆ˜๊ฐ€ 2์ด๊ณ , ์„ธ ๋ฒˆ์งธ ์ถ•์— ๊ฒน์น˜๋Š” ํšŸ์ˆ˜๋Š” 3์ด๋ผ๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ๋Ÿฐํƒ€์ž„์€ O(nlogn)์˜€์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ O(n^2)์ด์—ˆ๋‹ค(๋‚ด ์‚ฌ์ „ ๊ตฌ์กฐ๋ฅผ ์ฃฝ์ด๋Š” ๊ฒƒ)

์ด ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ์ฑ…์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ๋งˆ๋ผ.

ํ•œ ์ถ•์ด ์ค‘์ฒฉ์„ ๋ณด๊ณ ํ•˜๋Š” ๊ฒฝ์šฐ ์ €๋ ดํ•œ ์ „์ฒด ๊ฒฝ๊ณ„ ์ƒ์ž ํ™•์ธ โ€“ ์–‘์ˆ˜์ผ ๊ฒฝ์šฐ ํ•ด๋‹น ์Œ์„ ํ’€์˜ค๋ฒ„๋žฉ์— ์ถ”๊ฐ€ํ•˜์‹ญ์‹œ์˜ค.

ํ•œ ์ถ•์— ๋‘ ๊ฐœ์˜ ๋ชธ์ฒด๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๋‹ค๊ณ  ๋ณด๊ณ ๋œ ๊ฒฝ์šฐ, ํ’€์˜ค๋ฒ„๋žฉ์—์„œ ์Œ์„ ์ œ๊ฑฐํ•˜์‹ญ์‹œ์˜ค. (์ด๊ฒƒ์€ ์œ„์˜ ์ฝ”๋“œ๋กœ ํ–‰ํ•ด์ง„๋‹ค.) ๋”ฐ๋ผ์„œ SAP์— ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‹ค์‹œ O(n)์— ์ง€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

("CollisionSystemPersistent"์—์„œ Jitter์˜ ๊ตฌํ˜„์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ) SAP.cs".)

 

์ง€์†์ ์ธ Sweep and Prune ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋‹จ์  ์ค‘ ํ•˜๋‚˜๋Š” ๋งŽ์€ ๋น„ํ™œ์„ฑ ๊ฐ์ฒด๋ฅผ ๊ฐ€์ง„ ์ •๋ง ํฐ ์„ธ๊ณ„๋ฅผ ๊ฒฝํ—˜ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด์•Œ์ด ์ •์ ์ธ ๋ฌผ์ฒด๊ฐ€ ๋งŽ์€ ๋งˆ์„์„ ๊ด€ํ†ตํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•ด๋ณด๋ผ.

๊ฐ ๋ฌผ์ฒด(์ดํƒ„์œผ๋กœ๋ถ€ํ„ฐ ์ˆ˜๋งˆ์ผ ๋–จ์–ด์ ธ ์žˆ์–ด๋„)์™€ ํƒ„ํ™˜ ์ž์ฒด ์‚ฌ์ด์— ๊ตํ™˜์ด ์žˆ๋‹ค

์ด ๋ฌธ์ œ๋Š” ๊ทธ๋ฆฌ๋“œ(๊ด‘๋ฒ”์œ„ ๋‹จ๊ณ„)๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์†Œํ˜• SAP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚ด๊ฐ€ ์•Œ์•„์ฐจ๋ฆฐ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๊ด‘์„ ๊ณผ ๊ฒฝ๊ณ„ ์ƒ์ž ์งˆ์˜๊ฐ€ ํšจ์œจ์ ์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋ ˆ์ด์บ์ŠคํŒ…์˜ ๊ฒฝ์šฐ, ์ •๋ ฌ๋œ ์„ธ ๊ฐœ์˜ ๋ชฉ๋ก์€ ๊ท ์ผํ•˜์ง€ ์•Š์€ ๋ณต์…€ ๊ทธ๋ฆฌ๋“œ๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ฃผ๋ฌธํ•œ ๋ ˆ์ด ์ฟผ๋ฆฌ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒƒ์€ ์‹ค์ œ๋กœ๋Š” ๋‹ค์†Œ ๋Š๋ฆฌ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๋งŽ์€ ๋ณต์…€ ๊ทธ๋ฆฌ๋“œ๊ฐ€ ๋น„์–ด ์žˆ๊ณ  ์ดˆ๊ธฐ ํƒ€๊ฒฉ์„ ๋ฐ›์€ ๊ด‘์„ ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ผ ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‹จ์ง€ ๊ฐ ๋ฌผ์ฒด์— ๋Œ€ํ•ด ๊ฑฐ์นœ ํž˜ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ์ข…์ข… ๋” ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์žฅ๋ฉด์— ํ•˜๋‚˜์˜ ํฐ ๋ฌผ์ฒด(๋Œ€๊ฐœ ์ง€๋ฉด์ด๋‚˜ ๋ ˆ๋ฒจ)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์ด ๊ฐœ์ฒด์˜ ๋์ ์€ ์™„์ „ํžˆ ์™ผ์ชฝ์— ์žˆ๊ณ  ๋ชฉ๋ก ์˜ค๋ฅธ์ชฝ์— ์žˆ๋‹ค.

์Šค์œ„ํ”„ ํฌ์ธํŠธ์— ์ €์žฅ๋œ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ๊ฐœ์ฒด๊ฐ€ ํ›จ์”ฌ ๋” ํฐ ์—”ํ‹ฐํ‹ฐ์˜ ๋์ ์— ์˜ํ•ด ๋‘˜๋Ÿฌ์‹ธ์ด๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.

 

 

 

 

๋ฐ˜์‘ํ˜•

+ Recent posts