๐ฆ Ray casting
๐ฆ Ray casting
- R(t) = O + t * D ์ ์ผ๊ฐํ P(u, v) = V0 + u * (V1- V0) + v * (V2 - V0) ๊ฐ ์์ ๋
- R(t) = P(u, v) ๋ฅผ ๋ง์กฑํ๋ u, v, t ๋ฅผ ๊ตฌํ๋ค
- u โฅ 0, v โฅ 0, u+v โค 1 ์ผ ๋, R(t) ๋ ์ผ๊ฐํ ๋ด์ ์ ์ด๋ผ๊ณ ํ๋ณํ ์ ์๋ค.
1. ๊ด์
- ๊ด์ ์์ ํ ์ ์ ๋ํ ํํ
(o๋ ์์ , d๋ ๋ฐฉํฅ๋ฒกํฐ)
- ๋ฐฉํฅ๋ฒกํฐ๊ฐ ํญ์ ๋จ์ ๋ฒกํฐ์์ด ๋ณด์ฅ๋์ง๋ ์์ง๋ง, ๊ด๋ จ ์ฐ์ฐ ๋๋ถ๋ถ์์ ๋ฐฉํฅ๋ฒกํฐ๋ฅผ ์ ๊ทํํ์ฌ ์ฌ์ฉํจ
2. ํ๋ฉด
- Ray - Object ๊ต์ฐจ์ ๊ธฐ๋ณธ์ด ๋๋ ํ๋ฉด์ ํฌ๊ฒ ์ํจ์ ํ๋ฉด๊ณผ ๋ช ์์ ํ๋ฉด์ผ๋ก ๊ตฌ๋ถ๋จ
๋ช ์์ ํ๋ฉด
- ํ ๋ณ์๋ฅผ ๋ค๋ฅธ ๋ณ์๋ค์ ํจ์๋ก ์ง์ ํํํ๋ ๋ฐฉ์
- ์์: ํฌ๋ฌผ์ ์ ํ๋ฉด
-
๋ช ์์ ํ๋ฉด๊ณผ Ray ๊ฐ ๊ต์ฐจ๋ฅผ ๊ฒ์ฌํ ๋, ํจ์์
x,y๊ฐ์ ๋์ ํด๋ณด๊ณ ๊ทธ ๊ฐ์ z๊ฐ๊ณผ ๋น๊ตํ์ฌ ํ๋ฉด์ ์๋ ์ ์ธ์ง, ํ๋ฉด์ ์ง๋ ์ ์ธ์ง, ํ๋ฉด์ ๋ฟ์ง ๋ชปํ ์ ์ธ์ง ๊ฒฐ์ -
๊ตฌ์ ๊ฒฝ์ฐ ์ฒ๋ผ
x,y๊ฐ์ ๋์ ํ๋ฉดz๊ฐ ๋ ๊ฐ์ ๊ฐ์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ ๋ช ์์ ํํ์ผ๋ก ํํํ์ง ๋ชปํจ
- ๊ธฐํํ์ ์ผ๋ก ์ดํดํ๋ฉด, ํน์ `x`, `y`์ ๋ํด ์์ชฝ ๋ฐ๊ตฌ์ `z` ์ง์ ๊ณผ ์๋์ชฝ ๋ฐ๊ตฌ์ `z` ์ง์ ์ด ๋ ๊ฐ๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ ํํ ๋ถ๊ฐ
์ํจ์ ํ๋ฉด
- ํจ์๊ฐ์ด 0์ด๋๋ ์ ๋ค์ ์งํฉ์ด ํ๋ฉด
- ์์: ๊ตฌ์ ํ๋ฉด
-
ํจ์์
x,y,z๊ฐ์ ๋์ ํด๋ณด๊ณ ๊ทธ ๊ฐ์ด 0์ธ์ง ๊ฒ์ฌํ์ฌ ํ๋ฉด์ ์๋ ์ ์ธ์ง, ํ๋ฉด์ ์ง๋ ์ ์ธ์ง, ํ๋ฉด์ ๋ฟ์ง ๋ชปํ ์ ์ธ์ง ๊ฒฐ์ -
์ํจ์ ํ๋ฉด์ ์ด๋ค ํํ๋ ํํ์ด ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์์
- ๋ช ์์ ํ๋ฉด ๋ํ ์ํจ์ ํ๋ฉด์ผ๋ก ๋ฐ๊ฟ ์ ์์ผ๋ฉฐ, ๋๋ฌธ์ ๋ช ์์ ํ๋ฉด์ ์ํจ์ ํํ์ ํน๋ณํ ๊ฒฝ์ฐ๋ก ๋ณผ ์ ์์
- ๊ทธ๋ํฝ์ค์์๋ ์ฃผ๋ก ์ํจ์ ํ๋ฉด์ ๊ต์ฐจ ๊ฒ์ฌ์ ์ฌ์ฉ
3. ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ
-
์ผ๊ฐํ ๊ต์ฐจ ๊ฒ์ฌ๋ Mesh ๊ฐ ์ถฉ๋ ๊ฒ์ฌ๋ ๊ฒ์ ์์ง์์ ๊ฐ์ฅ ๋น์ผ ์ฐ์ฐ ์ค ํ๋์
-
์ ๊ตํ๊ฒ ์ถฉ๋์ ๊ฒ์ฌํ๊ธฐ ์ ์ Naiveํ๊ฒ ์ผ ์ฐ์ฐ์ผ๋ก ๊ต์ฐจ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฌผ์ฒด๋ค์ ๋จผ์ ๊ฑธ๋ฌ๋ธ ๋ค, ๊ต์ฐจ ํ๋ณด๊ฐ ๋๋ ๋ฌผ์ฒด๋ค๋ง ์ ๊ตํ๊ฒ ๊ฒ์ฌํ๊ธฐ ์ํด Naiveํ ๊ต์ฐจ ๊ฒ์ฌ ๋์์ผ๋ก ๋ฐ์ด๋ฉ ๋ณผ๋ฅจ์ ์ฌ์ฉํจ
- ์ผ๋ฐ์ ์ผ๋ก Local BV์ World BV๋ฅผ ๋ชจ๋ ๊ด๋ฆฌํ๋ฉฐ, World BV๋ก 1์ฐจ, Local BV๋ก 2์ฐจ๋ก ๊ฒ์ฌํจ
-
์ผ๋ฐ์ ์ผ๋ก ๊ตฌ๋ ๋ฐ์ค ํํ๋ฅผ ์ฌ์ฉํ๋ฉฐ, Unreal Engine์์๋ ๊ทธ ๋์ ํฉ์น
BoxSphereBounds๋ผ๋ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํจ
AABB(Axis-Alinged Bounding Box)
-
๊ฐ์ฒด๋ฅผ ๊ฐ์ธ๋ ์ถ ์ ๋ ฌ ์ง์ก๋ฉด์ฒด ๊ฒฝ๊ณ ๋ฐ์ค
-
๋ฐ์ค์ ๋ฉด์ด ์ขํ์ถ๊ณผ ํญ์ ํํํจ
-
๊ณ์ฐ์ด ๋จ์ํ๊ณ ์ถ ๋น๊ต๋ง ํ๋ฉด ๋์ด์ ๊ฑฐ์ ๋ชจ๋ ์์ง์์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๋จ
-
๋จ, ๊ฐ์ฒด๊ฐ ํ์ ํ์ฌ๋ AABB๋ ์ถ ์ ๋ ฌ์ด๊ธฐ ๋๋ฌธ์ ํจ๊ป ํ์ ํ์ง ์์ผ๋ฏ๋ก ํ์ ์ด ๋๋ ๋๋ง๋ค ๋ค์ ๊ณ์ฐํด์ผ ํจ
-
์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ
struct AABB { FVector Min; FVector Max; } -
๋ฐ์ค ๋ด๋ถ ํ์
bool Inside = P.x >= Min.x && P.x <= Max.x && P.y >= Min.y && P.y <= Max.y && P.z >= Min.z && P.z <= Max.z;
AABB ์์ฑ๊ณผ ๋ณํ
-
AABB ์์ฑ ์์ฒด๋ ์ ์ฒด ์ ์ ์งํฉ์ ๋์๋ค๋๋ฉฐ ๊ฐ ์ถ์ ์ต์, ์ต๋ ์ง์ ์ ์ฐพ์ผ๋ฉด ๋์ง๋ง, ์ด ์ฐ์ฐ๋ ๋ฌผ์ฒด์ ๋ณํ์ด ๋ฐ์ํ ๋๋ง๋ค ์ํํ๋ฉด ์ฐ์ฐ์ด ๋ถ๋ด๋ ์ ์์
-
Unreal Engine์์๋ ๋ฌผ์ฒด์ Local AABB๋ฅผ ๋ฌผ์ฒด ์์ฑ ์ ๋จผ์ ๊ณ์ฐํ๊ณ , ๋ฌผ์ฒด๊ฐ ๋ณํ๋จ์ ๋ฐ๋ผ์ ํจ๊ป ๋ณํํจ
-
UStaticMeshComponent๋ฑ์์ ์์ฑ ์ Local AABB๋ฅผ ์ ์ฅ- AABB๋ฅผ ์์ฑํ ํ
Origin์ ์ฅ
- AABB๋ฅผ ์์ฑํ ํ
-
- `USceneComponent`์์ Transform ๋ณ๊ฒฝ ๋ฐ์ ์ BV ์
๋ฐ์ดํธ
-
๋ณํ ๋ฐฉ๋ฒ
-
Unreal Engine์
TBoxSphereBounds๋ ์์ ๋ฒกํฐOrigin๊ณผ ๊ฐ ์ถ ๋ฐฉํฅ์ผ๋ก์BoxExtents(๋ฒกํฐ)๋ฅผ ๊ฐ์ง๊ณ ์์ -
๋ฌผ์ฒด์ ๊ฐํด์ง ๋ณํ ํ๋ ฌ์
M์ผ๋ก ๊ฐ์ -
Origin์ ๋จ์ํM์ ์ด๋ ์ฐ์ฐ ๋ถ๋ถ๋ง ํ์ฉํ์ฌ ๋ฌผ์ฒด์ ํจ๊ป ์ด๋๋ง ์์ผ์ฃผ๋ฉด ๋จ -
๋ณํ ํ๋ ฌ์ ์ ํ ๋ณํ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์
-
BoxExtents ๋ฒกํฐ๋ฅผ e๋ผ ํ๋ฉด, BoxExtents๋ e' = e |A|๋ก ๊ณ์ฐํ ์ ์์
Bounding Sphere ์์ฑ๊ณผ ๋ณํ
-
Bounding Sphere๋ ์คํ๋ ค AABB๋ณด๋ค ๊ฐ๋จํ๋ค๊ณ ๋ณผ ์ ์์
-
Unreal Engine์์ Bounding Sphere๋ฅผ ์์ฑํ ๋๋, AABB์ ์ ์ฌํ๊ฒ ์ ์ฒด ์ ์ ์งํฉ์์ AABB๋ก๋ถํฐ ๊ณ์ฐ๋ Origin์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๋ฉ๋ฆฌ ๋จ์ด์ง ์ ์ ์ ๋ณด๋ฅผ ํตํด ๋ฐ์ง๋ฆ ์ ๋ณด
SphereRadius๋ฅผ ๊ณ์ฐ -
๋ณํํ ๋๋ ์์ ์ ๊ทธ๋๋ก ์ด๋๋ง ์ํค๊ณ , ํ์ ์๋ ์ํฅ์ ๋ฐ์ง ์์
-
๋ณํ์์ ๊ณ ๋ คํด์ผํ๋ ๋ถ๋ถ์ ์ค์ผ์ผ
-
๊ท ์ผ ์ค์ผ์ผ์ ๊ฒฝ์ฐ์๋ ๊ฐ๋จํ ๋ฐ์ง๋ฆ์ ์ค์ผ์ผ ๊ณ์๋ฅผ ๊ณฑํ์ฌ ๋ณํ
-
๋น๊ท ์ผ ์ค์ผ์ผ์ ๊ฒฝ์ฐ์๋ ๊ฐ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ฅ ํฐ ์ค์ผ์ผ ๊ฐ์ ๋ฐ์ง๋ฆ์ ๊ณฑํ์ฌ ๋ณํ
-
4. ๊ต์ฐจ
๊ด์ - ๊ตฌ
- ๊ธฐ๋ณธ์ ์ผ๋ก ๊ตฌ์ ์ํจ์ ํ๋ฉด ๊ฒ์ฌ
- ๊ด์ ์ ๋์ ํ์ฌ ์ ๋ฆฌ
- ๋ง์ฝ ๊ด์ ์
d๊ฐ ๋จ์ ๋ฒกํฐ์ด๊ณ ,b = d \cdot (o - c), c = (o - c) \cdot (o - c) - r^2๋ผ๊ณ ๊ฐ์ ํ๋ฉด,t์ ๋ํด ์๋ ์์ผ๋ก ์ ๋ฆฌ๋จ
- ์ฆ,
b^2 - c์ ๋ฐ๋ผ ๊ด์ ์ด ๊ตฌ์ ๋ง๋์ง ๋ง์ง ์๋์ง๋ฅผ ๊ฒ์ฌํ ์ ์์
๊ด์ - ์์
-
OBB๊น์ง ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ์๋๊ณ , AABB์ ํนํ๋ ์กฐ๊ธ ๋ ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ
- โ์ฌ๋๋ธ ๋ฐฉ๋ฒโ์ด๋ผ๊ณ ๋ถ๋ฆ
-
x,y,z์ ํด๋นํ๋ ์ถ์ ํฌ๊ฒA๋ผ๊ณ ํํ -
๊ด์ ์ด ์ถ๋ฐ์ ์์ ๋์ (๊ด์ ์ ์๋ ๋์ด ์์ง๋ง ๋ฌผ๋ฆฌ ์ฐ์ฐ ํ๊ณ์ ์ฝ ์์์ + 100,000 ์ ๋๋ฅผ ๋์ ์ ์ก์)๊น์ง ๋์ฐฉํ ๋ ์๊ฐ์ 1๋ก ๋๊ณ , ๊ด์ ์ด ์ถ๋ฐ์ ์์ ์ฒ์ AABB์ ๋ฟ๋ ์๊ฐ์
t๋ก ๋ -
t์ ๊ฐ ์ถ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์
- ๋จ, ๊ณ์ฐ ์ ๊ด์ ์ ์์์ ๊ณผ ๋์ ์ด ๋ชจ๋ AABB๋ฅผ ์ง๋์ง ์๋๋ค๋ฉด ์ฐ์ฐ ์์ฒด๋ฅผ ํ์ง ์์
- ์์์ ์ด ์ ์ด์ AABB ์์ ์์ด๋ ์ฐ์ฐ์ ๋ฐ๋ก ์ํํ์ง ์์
-
t์ ๊ฐ ์ถ ๊ฐ ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ด ์ค์ ๋ก ๊ด์ ์ด AABB์ ๋ฟ๋ ์์ -
Unreal Engine ์์ค์ฝ๋์์๋ ๋ง์ง๋ง์ ๋ถ๋ ์์์ ์ค์ฐจ๋ฅผ ๊ณ ๋ คํ๋ ์๊ณ๊ฐ์ ์ถ๊ฐํจ
๊ด์ - ์ผ๊ฐํ
-
์์ฉ ์์ง์์๋ Ray Casting์ ์ฌ๋ฌ phase๋ฅผ ํตํด ์ฌ์ฉํ๋๋ฐ, ๊ฐ์ฅ ๋ฎ์ narrow phase์์๋ ๊ฑฐ์ ๋ฐ๋์ ๊ด์ - ์ผ๊ฐํ ๊ฒ์ฌ๋ฅผ ์ํํ๊ฒ ๋จ
- ๊ด์ - ํด๋ฆฌ๊ณค ๊ฒ์ฌ ๋ฐฉ๋ฒ์ด ์ฐ๊ตฌ๋๊ธฐ๋ ํ์ง๋ง, GPU๋ ๊ฒฐ๊ตญ Mesh๋ฅผ ์ผ๊ฐํ ๊ธฐ๋ฐ์ผ๋ก ๋ ๋๋งํ๊ณ , CPU์์ ์ฒ๋ฆฌ ๋ํ ์ผ๊ฐํ ๋จ์๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ด์ - ์ผ๊ฐํ ๊ต์ฐจ ๊ฒ์ฌ๋ ๊ทธ๋ํฝ์ค์์ ์ ๋์ ์ธ ํ์ค ๊ฒ์ฌ์
-
์๋์์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๊ด์ - ์ผ๊ฐํ ๊ต์ฐจ์ ๊ฐ์ฅ ํ์ค์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ธ MรถllerโTrumbore ๊ต์ฐจ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๊ณ ๋ถ๋ฆ
-
โ์ผ๊ฐํ์ด ๋์ธ ํ๋ฉด๊ณผ ๊ด์ ์ ๊ต์ฐจ์ ์ ๊ณ์ฐํด์, ํด๋น ๊ต์ฐจ์ ์ด ์ผ๊ฐํ ๋ด์ ์๋์ง ๊ฒ์ฌํ๋ฉด ๋์ง ์๋?โํ๊ณ ์๊ฐํ ์๋ ์์ง๋ง, ๋ ๋จ๊ณ๋ก ๋ถ๋ฆฌํ์ฌ ๊ตฌํํ๋ฉด ๊ฐ์ข ๋ถ๊ธฐ ์ฒ๋ฆฌ๊ฐ ๋์ด๋๊ณ ์์น์ ์ผ๋ก ๊ณ์ฐ์ด ๋ฒ๊ฑฐ๋ก์์ง๋ ๋ถ๋ถ์ด ์๊น
- MรถllerโTrumbore ๊ต์ฐจ ์๊ณ ๋ฆฌ์ฆ์ ์ด๋ฐ ์ฐ์ฐ์ ํ ๋ฒ์ ์ฒ๋ฆฌํจ
-
์ผ๊ฐํ ๋ด๋ถ์ ํ ์ ์ ๋ํ ํํ(
V_{0, 1, 2}๋ ์ผ๊ฐํ์ ๊ฐ ์ ์ ,u,v๋ ์ผ๊ฐํ ๋ฌด๊ฒ์ค์ฌ ์ขํ๊ณ ๋ด ์์์ ์ค์นผ๋ผ)
- ๊ด์ ๊ณผ ์ผ๊ฐํ์ด ๋ง๋ ๋์ ์
์ ๋ฆฌํ๋ฉด,
\[O - V_0 = u E_1 + v E_2 - t D\]- ๊ฐ ๋ณ์์ ์กฐ๊ฑด์ ๋ค์๊ณผ ๊ฐ์
-
๊ด์ ์ ๋ฐฉํฅ ๋ฒกํฐ
D๋ ํ์๋ ์๋์ง๋ง ์ ๊ทํํด๋๋ ํธ์ด ์ข์(์ซ์๊ฐ ๊น๋ํด์ง) -
๊ณ์ฐ ์๊ณ ๋ฆฌ์ฆ
- ๋จผ์
P๋ฒกํฐ์Det๋ฅผ ๊ณ์ฐ
- ๋จผ์
- `Det`๋ ์ค์นผ๋ผ ์ผ์ค๊ณฑ์ผ๋ก, `E_1`, `E_2`, `D`๊ฐ ๋ง๋๋ ๋ถํผ์ ํด๋นํ๋ ๊ฐ์ผ๋ก๋ ๋ณผ ์ ์์
- `Det`๊ฐ 0์ ๊ฐ๊น๋ค๋ ๊ฒ์ ๊ด์ ์ ๋ฐฉํฅ ๋ฒกํฐ `D`๊ฐ ์ผ๊ฐํ ํ๋ฉด๊ณผ ๊ฑฐ์ ํํํ๊ฑฐ๋, ์ผ๊ฐํ์ ํํ๊ฐ ์๋ฏธ์์ ์ ๋๋ก ์ฐ๊ทธ๋ฌ์ ธ ์๋ค๋ ๋ป์ด๋ฏ๋ก ์์ ์ ์ผ๋ก ํ ์ ์๋ค๋ ๋ป์ด๊ธฐ์ `EPSILON`(์ผ๋ฐ์ ์ผ๋ก `1e-6f`)๋ฑ๊ณผ ๋น๊ตํ์ฌ ์ฐ์ฐ์ ๋ฉ์ถค
```C++
if (fabs(Det) < EPSILON) { return false; }
```
- Back-face culling ์, ์ผ๊ฐํ์ ๋ท๋ฉด์ ํด๋ฆญํด๋ ์ ํ๋์ง ๋ชปํ๊ฒ ํ๋ ค๋ฉด `fabs(Det)`๋์ ๊ทธ๋ฅ `Det` ์ฌ์ฉ
2. `u` ๊ณ์ฐ
- `T`๋ ์ผ๊ฐํ์ ๊ธฐ์ค์ `V_0`์์ ๊ด์ ์ ์์ `O`๊น์ง ๊ฐ๋ ๋ฒกํฐ
- ๋๋ถ๋ถ์ ๊ฒ์ ์์ง์์๋ `u`๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ฉด ์ฐ์ฐ์ ๋ฉ์ถค
```C++
if (u < 0.0f || u > 1.0f) { return false; }
```
3. `v` ๊ณ์ฐ
- `v`์ ๋ฒ์๋ `u + v`์ ๋ฒ์๊ฐ ๋ฒ์ด๋๋ฉด ์ฐ์ฐ์ ๋ฉ์ถค
```C++
if (v < 0.0f || u + v > 1.0f) { return false; }
```
4. ๋ง์ง๋ง์ผ๋ก `t` ๊ณ์ฐ
- ๋ง์ฝ `t < 0`์ด๋ผ๋ฉด ๊ด์ ์ด ์ผ๊ฐํ์ ์ง๋์น ๊ณณ์์ ๋ฐ์ฌ๋์๋ค๋ ๋ป์ด๋ฏ๋ก ๊ต์ฐจ ๋ถ์
```C++
if (t < 0.0f) { return false; }
```
5. ์ฌ๊ธฐ๊น์ง ๋ชจ๋ ์กฐ๊ฑด ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๋ฉด ์ผ๊ฐํ๊ณผ ๊ด์ ์ด ๊ต์ฐจํ๋ ๊ฒ์ด๋ฉฐ, ๊ทธ ๊ต์ฐจ์ ์ `O + t D`์
5. Ray Casting์ ์ํ Inverse Projection / View
-
Ray casting์ ๊ฒฐ๊ตญ World ๊ณต๊ฐ์์ ์ผ์ด๋์ง๋ง, ๋ง์ฐ์ค ์ ํ ์์ฒด๋ Screen ๊ณต๊ฐ์์ ์ผ์ด๋๊ธฐ ๋๋ฌธ์ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๊ณต๊ฐ ์ขํ๊ณ ๋ณํ ๊ณผ์ ์ ์ญ์ผ๋ก ์ํํ ํ์๊ฐ ์์
-
ํ๋ฉด์ ๋ง์ฐ์ค ์ขํ
(s_x, s_y)์ ๋ํ ๊ณต๊ฐ ์ขํ๊ณ ์ญ๋ณํ- Screen ๊ณต๊ฐ -> NDC ๊ณต๊ฐ: ํ๋ฉด ์์ ๋ง์ฐ์ค ์์น๋ฅผ ์ ๊ทํ๋ ์ขํ๋ก ๋ณํ
2. Near / Far ์ ๋ง๋ค๊ธฐ: ๊ฐ์ `(x, y)`์ `z`๋ง ๋ค๋ฅด๊ฒ ํ์ฌ ๋ ์ ์ ์์ฑ
- Graphics ๋ผ์ด๋ธ๋ฌ๋ฆฌ API ๊ท์ฝ์ ๋ฐ๋ผ `z` ๋ฒ์๊ฐ ๋ค๋ฆ
- OpenGL: `[-1, 1]`, DirectX: `[0, 1]`
- `z` ๋ฟ ์๋๋ผ, 4์ฐจ์ ๋์ฐจ ์ขํ(homogeneous coordinate)๋ก ๋ง์ง๋ง ์์ 1๋ ์ถ๊ฐํด์ค
3. Inverse Projection: NDC ๊ณต๊ฐ -> View ๊ณต๊ฐ
- ์ญ๋ณํ์ ๊ฒฐ๊ณผ๋ ๋ณดํต `(x, y, z, w)`์ ํํ๋ก ๋์ค๋๋ฐ, ์ด๋ฅผ ์ค์ 3D ์ ์ฒ๋ผ ์ฐ๊ธฐ์ํด `w`๋ก ๋๋์ด์ฃผ๋ homogeneous divide๋ฅผ ์ํํจ
4. Inverse View: View ๊ณต๊ฐ -> World ๊ณต๊ฐ
- ์ฌ์ค View ๊ณต๊ฐ์์๋ ์ด๋ฏธ ๊ด์ ์ View ๊ณต๊ฐ์ ์์ ์์ ์ถ๋ฐํ๋ ๊ด์ ์ผ๋ก์จ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ View ๊ณต๊ฐ์์ ์ฐ์ฐ์ ์ํํด๋ ๋์ง๋ง, ๋ณดํต ์ต์ข
์ ์ผ๋ก Inverse View๊น์ง ์ํํจ
5. World Ray ์์ฑ: `P_near^world`, `P_far^world` ๋ ์ ์ ์ด์ฉํ์ฌ World ๊ณต๊ฐ ๋ด ๊ด์ ์์ฑ
6. ์์ฉ ์์ง์์ Ray Casting์ ํ์ฉํ๋ ๋ฐฉ๋ฒ
-
์์ง ๊ฐ๋ฐ์์ ์ ์ฅ์์๋ Ray Casting์ผ๋ก ์ ์ผ ๋จผ์ ๋ ์ฌ๋ฆด ์ ์๋ ๊ฒ์ด ํธ์ง๊ธฐ ํ๋ฉด ๋ด์์์ ๊ฐ์ฒด ์ ํ์
-
ํ์ง๋ง ์ค์ ๋ก ์์ฉ ์์ง์์๋ ํธ์ง๊ธฐ ๋ด ๊ฐ์ฒด ์ ํ์ ์ฃผ๋ก ์ ๊ธฐ๋ฐ ๋ฐฉ์์ ์ฌ์ฉํจ(Unreal Engine์ Hit Proxy ๋ฑ)
-
๊ฒ์ ๋ด ๋ฌผ๋ฆฌ ์ถฉ๋ ๊ฒ์ฌ ๋ฑ์์ Ray Casting์ ์ฃผ๋ก ํ์ฉํ๊ฒ ๋๋๋ฐ, ์ ํํ ๊ฒ์ฌ๋ฅผ ์ํด์๋ ๊ฒ์ ๋ด ๋ชจ๋ ๊ฐ์ฒด์ ์ ์ ๋ค์ ์ด์ฉํ์ฌ ์ผ์ผํ ๊ด์ -์ผ๊ฐํ ์ฐ์ฐ์ ์ํํด์ผ ํ์ง๋ง, ์ด๋ ๋งค์ฐ ์ฌ๊ฐํ ์ฑ๋ฅ ์์ค์ ๊ฐ์ ธ์ด
- ๊ฐ์ฒด์ ํํ๊ฐ ์กฐ๊ธ๋ง ๋ณต์กํด์ ธ๋ ๊ฐ์ฒด ํ๋์ ์๋ง์ ์ ์ ๊ณผ ์ผ๊ฐํ ํ๋ฆฌ๋ฏธํฐ๋ธ๋ค์ด ์กด์ฌํ๊ฒ ๋จ
-
์ด ์ฑ๋ฅ ์์ค์ ๊ฐ์ ํ๊ธฐ ์ํด ์์ฉ ์์ง์์๋ Ray Casting ๊ฒ์ฌ๋ฅผ ์ฌ๋ฌ ํ์ด์ฆ๋ก ๋๋์ด์ ๊ณ์ฐํจ
-
์ผ๋ฐ์ ์ธ phase ๊ตฌ์ฑ
-
Broad Phase: BV๋ฅผ ํ์ฉํ์ฌ ๊ด์ ๊ณผ ์ถฉ๋ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฐ์ฒด๋ค๋ง ์ถ๋ฆฌ๊ธฐ
-
Mid Phase: ๊ฐ์ฒด์ ๊ด๋ จ๋ ๊ฐ์ข ํํฐ(Visibility, ์ถฉ๋ ๋ฌด์ ํ๋๊ทธ ๋ฑ)๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์ฒด ์ถ๋ฆฌ๊ธฐ
-
Narrow Phase: ํ๋ณด ๊ฐ์ฒด๋ค ์ค์์ ๊ด์ ์ด ์ด๋ค ๊ฐ์ฒด๋ฅผ ๋ง์ถ์๋์ง ์ ํํ ๊ณ์ฐ
-
์ฌ๊ธฐ์๋ ๊ฐ๋จํ ํํ์ ์ง์ค๋ฉํธ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๊ทผ์ฌ์ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์์(์ ํ๋ ๊ฐ์, ์๋ ์ฆ๊ฐ)
- Unreal Engine์์๋
trace_complex์ต์ ์ดtrue๊ฐ ์๋๋ฉด ๊ฐ๋จํ ํํ์ ์ง์ค๋ฉํธ๋ฆฌ๋ก ๋น ๋ฅด๊ฒ ๊ฒ์ฌํจ
- Unreal Engine์์๋
-
-
Picking
- Sphere โ AABB โ Ray-Triangle test ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ํ (์ฐ์ฐ ๋น์ฉ ์)
GitHub ๊ณ์ ์ผ๋ก ๋๊ธ์ ์์ฑํฉ๋๋ค.
ํ์ฌ ์ถ์ฒ ์: ์กฐํ ์ค...
GitHub ์ด์์ ๐ ๋ฐ์์ ์ง๊ณํฉ๋๋ค.
์ถ์ฒ(๐) ๋จ๊ธฐ๊ธฐ
์ด ๋ฌธ์ ์์ ์ค์์ ํธ์งํ๊ธฐ