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"์ ๋ค์ ํญ๋ชฉ์ ๊ณ์ํฉ๋๋ค.

์ด ์ ๊ทผ๋ฒ์ด ์ง์์ ์ด์ง ์๋ค๋ ๊ฒ์ ์๊ฒ๋ฉ๋๋ค.
์ ๋ ฌ์ ์ฒ์๋ถํฐ ๋ชจ๋ ํ๋ ์์์ ์ํ๋๋ฉฐ(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๋ฅผ ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
๋ด๊ฐ ์์์ฐจ๋ฆฐ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๊ด์ ๊ณผ ๊ฒฝ๊ณ ์์ ์ง์๊ฐ ํจ์จ์ ์ผ๋ก ์ํ๋ ์ ์๋ค๋ ๊ฒ์ด๋ค.
๋ ์ด์บ์คํ ์ ๊ฒฝ์ฐ, ์ ๋ ฌ๋ ์ธ ๊ฐ์ ๋ชฉ๋ก์ ๊ท ์ผํ์ง ์์ ๋ณต์ ๊ทธ๋ฆฌ๋๋ก ํด์๋ ์ ์์ผ๋ฏ๋ก, ์ฃผ๋ฌธํ ๋ ์ด ์ฟผ๋ฆฌ๋ฅผ ์ป์ ์ ์๋ค.
์ด๊ฒ์ ์ค์ ๋ก๋ ๋ค์ ๋๋ฆฌ๋ค.
์๋ํ๋ฉด ๋ง์ ๋ณต์ ๊ทธ๋ฆฌ๋๊ฐ ๋น์ด ์๊ณ ์ด๊ธฐ ํ๊ฒฉ์ ๋ฐ์ ๊ด์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ผ ๋ฟ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๋จ์ง ๊ฐ ๋ฌผ์ฒด์ ๋ํด ๊ฑฐ์น ํ ๊ฒ์ฌ๋ฅผ ํ๋ ๊ฒ์ด ์ข ์ข ๋ ๋น ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ์ฅ๋ฉด์ ํ๋์ ํฐ ๋ฌผ์ฒด(๋๊ฐ ์ง๋ฉด์ด๋ ๋ ๋ฒจ)๊ฐ ํฌํจ๋์ด ์๋ค๋ ๊ฒ์ด๋ค.
์ด ๊ฐ์ฒด์ ๋์ ์ ์์ ํ ์ผ์ชฝ์ ์๊ณ ๋ชฉ๋ก ์ค๋ฅธ์ชฝ์ ์๋ค.
์ค์ํ ํฌ์ธํธ์ ์ ์ฅ๋ ์ถ๊ฐ ์ ๋ณด๊ฐ ์์ผ๋ฉด ๊ฐ์ฒด๊ฐ ํจ์ฌ ๋ ํฐ ์ํฐํฐ์ ๋์ ์ ์ํด ๋๋ฌ์ธ์ด๋์ง ์ฌ๋ถ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ฐ์งํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋ค.