3D ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์, ์๊ฒ๋ ์์๋ค์ ๋ํด ์ ์ด๋ณด๋ ค๊ณ ํด.
๋๊ตฌํํ ๋ฐฐ์๋ณธ์ ๋ ์๊ณ , ํ๋ก์ ํธ ์งํํ๋ฉด์ ์์ฐ์ค๋ ์ด๊ฒ์ ๊ฒ ์ฐพ์๋ณด๋ฉฐ ์๊ฒ๋๊ฑฐ๋ผ ์๋ชป๋๊ฒ ์์์๋ ์๋๋ฐ,ย
๋ด๊ฐ ์๋ชป ์๊ณ ์๋๊ฒ ์์ผ๋ฉด ์๋ ค์ค.
1. ์ ๋ํฐ ํ์ด์ด๋ผํค์์์์ ํธ๋์คํผ ๊ณ์ฐ ๋ฐ ์ขํ๊ณ ๋ณํ
1, 2, 3์๋ ๋๋ค์ผ๋ก ๋ฃ์ด๋ ํฌ์ง์ /๋กํ ์ด์ /์ค์ผ์ผ ๊ฐ์ด ๋ค์ด์๊ณ , ์ค๋ธ์ ํธ๋ ํธ๋์คํผ์ด ๊ธฐ๋ณธ๊ฐ์ด์ผ.
๊ฐ ์ค๋ธ์ ํธ์ ๋งคํธ๋ฆญ์ค๋ ์ด๋ ๊ฒ ๊ตฌํ๋ฉด ๋ผ.ย
๋ก์ปฌ ์คํ์ด์ค์ ํ ์ ์ ์ด ๋งคํธ๋ฆญ์ค๋ฅผ ์ ์ฉ์์ผ์ฃผ๋ฉด, ๋ถ๋ชจ ๊ณต๊ฐ์์์ ์์น๊ฐ ๋์
์ค๋ธ์ ํธ์ ๋ฉ์ฌ๊ฐ ๋ถ์ด์์ ๋, ๊ทธ ๋ฉ์ฌ์ ์ ์ ์ ํด๋น ์ค๋ธ์ ํธ์ ๋งคํธ๋ฆญ์ค๋ฅผ ๊ณฑํด์ฃผ๋ฉด, ๋ถ๋ชจ ๊ธฐ์ค์ ์์น๋ก ๋ณํ๋ผ. ๋ถ๋ชจ๊ฐ ์๋ค๋ฉด ์๋์คํ์ด์ค๊ฐ ๋๊ฒ ์ง.
๋ฐ๋๋ก ๋ถ๋ชจ ์ค๋ธ์ ํธ์ ํธ๋์คํผ์์ ์์ ์ค๋ธ์ ํธ์ ๊ณต๊ฐ์ผ๋ก ์ขํ๋ฅผ ๋ณํ์์ผ์ฃผ๊ณ ์ถ์ผ๋ฉด ๊ฒฐ๊ณผ ๋งคํธ๋ฆญ์ค์ .inverse ๋ถ์ฌ์ฃผ๋ฉด ๋ผ.
์ ๋ํฐ ๋ด๋ถ ๊ณ์ฐ ๊ฐ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์.
์ฐธ๊ณ ๋ก ์ o1Matrix * o2Matrix * o3Matrix๊ฐ unity_ObjectToWorld ๋งคํธ๋ฆญ์ค์ ๊ฐ์.
๋งคํธ๋ฆญ์ค ์์ฐ๊ณ ์ง์ ๊ณ์ฐํด๋ณด๊ณ ์ถ์ผ๋ฉดย Scale -> Rotation -> Translate ์์๋ก ๊ณ์ฐํ๋ฉด ๋ผ.
์ ๊ธฐ์ localRotation์ ์ฟผํฐ๋์จ ๊ณ์ฐ์ธ๋ฐ, ์ด๊ฑธ eular๋ก ๋ฐ๊ฟ์ฃผ๋ฉดย Z, X, Y ์์๋กย ํ์ ์ํจ ๊ฒฐ๊ณผ์ ๊ฐ์.
์ด๊ฒ ์ญ์ ๊ณ์ฐํด๋ณด๋ฉด ์ ๋ถ ์ ๋ํฐ ํธ๋์คํผ ๊ฐ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์.
์์์์ ๋ถ๋ชจ ๋ฐฉํฅ์ผ๋ก, Scale -> Rotate Z -> Rotate X -> Rotate Y -> Translate๋ฅผ ๋ฐ๋ณตํด์ฃผ๋๊ฑฐ์ผ.
์ด๋ ๊ฒ ๊ณ์ฐ ์ํ๊ณ ๋งคํธ๋ฆญ์ค๋ฅผ ๋ง๋ค์ด์ ์ฐ๋ ์ด์ ๋,ย
๋ฉ์ฌ์ ๋ชจ๋ ๋ฒํ ์ค์ ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ object -> world ๋ณํ ๋งคํธ๋ฆญ์ค๋ฅผ ํ๋ฒ๋ง ๊ณฑํด์ฃผ๋๊ฒ ๋งค๋ฒ ์๋ก ๊ณ์ฐํ๋๊ฒ๋ณด๋คย ํจ์ฌ ํจ์จ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐํด.
2. ์๋ ์คํ์ด์ค, ๋ทฐ ์คํ์ด์ค, ํด๋ฆฝ ์คํ์ด์ค, ๋์ค
์๋ ์คํ์ด์ค๋ ์ฐ๋ฆฌ๊ฐ ์๋ ์ ๋ํฐ์์์ย ์ขํ๊ณ์ผ.
๋ทฐ ์คํ์ด์ค๋ ์ฝ๊ฒ ๋งํ์๋ฉด ์นด๋ฉ๋ผ ๊ธฐ์ค์ ๊ณต๊ฐ์ด๊ณ ,ย
ํด๋ฆฝ ์คํ์ด์ค๋ ์นด๋ฉ๋ผ์ ์์ผ๊ฐ, perspective, ํด๋ฆฌํ, ๊ฑฐ๋ฆฌ์ ๋ฐ๋ฅธ ์ขํ์กฐ์ ๋ฑ์ด ์ ์ฉ๋์ด์ ์คํฌ๋ฆฐ์ ๊ทธ๋ฆด ์์น๋ฅผ ํน์ ํ ์ ์๊ฒ๋ ๊ณต๊ฐ์ด์ผ.
๋ทฐ ์คํ์ด์ค๋ ๋ทฐ ๋งคํธ๋ฆญ์ค๋ฅผ ์๋ ํฌ์ง์ ์ ๊ณฑํด์ฃผ๋ฉด ๊ตฌํ ์ ์๊ณ ,ย ํด๋ฆฝ ์คํ์ด์ค๋ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค๋ฅผ ๋ทฐ ํฌ์ง์ ์ ๊ณฑํด์ฃผ๋ฉด ๊ตฌํ ์ ์์ด.
๋ทฐ ๋งคํธ๋ฆญ์ค๋ ํฌ๊ฒ ํน๋ณํ ๊ฑด ์์ด. ์์์ ์ค๋ธ์ ํธ์ ๋งคํธ๋ฆญ์ค๋ฅผ ์ ์ฉ์์ผ์ ์ขํ๊ณ๋ฅผ ๋ฐ๊ฟ์ฃผ๋๊ฑฐ๋ ์ ์ฌํด.ย
์ค์ผ์ผ์ด 1๋ก ๊ณ ์ ๋๊ณ , z์ -1์ด ๊ณฑํด์ง๋ค๋๊ฒ ๋นผ๊ณค.
๊ทผ๋ฐ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค๋ OpenGL์ด๋, Direct๋, Reversed Z๋ฅผ ์ด์ฉํ๋ ์ํ๋์ ๋ฐ๋ผ 4๊ฐ์ง๋ก ๋๋๋๊ฒ ๊ฐ์. ํ์คํ์ง ์์.
์ ๋ํฐ์์ ๊ตฌํ๋ Camera.projectionMatrix๋ OpenGL ํ์์ Reversed Z๊ฐ ์ ์ฉ ์๋ ๋งคํธ๋ฆญ์ค๋ฅผ ๋ฐํํด.
์ด ๋งคํธ๋ฆญ์ค๋ฅผย ์ค์ ๋ก ์ด์ฉํ ๋๋ ์ ๋ํฐ์ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค๋ฅผ GL.GetGpuProjectionMatrix()ํจ์๋ฅผ ํตํด ์ค์ ์ด์ฉ๋๋ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค๋ก ๋ณํ์์ผ์ค์ผ ํด.
์ด ๋งคํธ๋ฆญ์ค๋ฅผ ๋ทฐ ํฌ์ง์ ์ ๊ณฑํด์ฃผ๊ณ ๊ฒฐ๊ณผ ๊ฐ์ w๋ก xyz๋ฅผ ๋๋์ด์ฃผ๋ฉด ํด๋ฆฝ์คํ์ด์ค ํฌ์ง์ ์ด ๋์.
clip.xyz / clip.w
ํด๋ฆฝ ์คํ์ด์ค์์ ์ค์ํ๊ฑด, ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค๊ฐ ์ ์ฉ๋์ ๋์จ float4์์ w๊ฐ์ผ๋ก xyz๋ฅผ ๋๋์ด์ค์ผ ์ฐ๋ฆฌ๊ฐ ์ค์ ๋ก ์๊ฐํ๋ ํด๋ฆฝ์คํ์ด์ค ์์ ์ขํ๊ฐ ๋์จ๋ค๋๊ฑฐ์ผ.ย
์ด ์ขํ๊ฐ ์คํฌ๋ฆฐ ์์ ์์น, ๊ทธ๋ฆฌ๊ณ ๋์ค ๊ฐ์ด์ผ.
x๋ y๋ -1์์ 1 ์ฌ์ด, z๋ -1~1 ๋๋ 0~1 ์ฌ์ด์ ๊ฐ
์ฌ๊ธฐ์ x์ -1์ ํ๋ฉด์ ์ผ์ชฝ๋, 1์ ํ๋ฉด์ ์ค๋ฅธ์ชฝ ๋์ด์ผ.
z๋ Reversed Z๊ฐ ์๋๊ฒฝ์ฐ, 0์์(๋๋ -1)์์ near plane, 1์์ far plane
ClipPosition.w์๋ -ViewPosition.z๊ฐ ๋ค์ด๊ฐ๊ณ , ๋ทฐ ํฌ์ง์ ์ -1์ด ์ ๋ฉด์ด๊ธฐ ๋๋ฌธ์,ย
-ViewPosition.z๋ ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๋ ์นด๋ฉ๋ผ ์คํ์ด์ค ์์ z๊ฐ์ ์๋ฏธํด. ๊ทธ๋ฌ๋๊น, ์นด๋ฉ๋ผ๋ก๋ถํฐ ์ผ๋ง๋ ๋ฉ๋ฆฌ ๋จ์ด์ ธ์๋์ง๋ก ๋๋๋๊ฑฐ์ผ.
ํ๋ก์ ์ ์์ ๊ฐ์ฅ ์ค์ํ๊ฑด ๊ฑฐ๋ฆฌz๋กย xy๊ฐ์ ๋๋์ด์ฃผ๋ ๊ณ์ฐ์ธ๋ฐ,
(์นด๋ฉ๋ผ์ ์ ๋ฉด์ด z๋๊น, x,y๋ฐฉํฅ์ ๊ณง ํ๋ฉด์ ๊ฐ๋ก ์ธ๋ก ๋ฐฉํฅ์ ์๋ฏธ, ๋ฉ๋ฆฌ ์์์๋ก ํ๋ฉด ์ค์์ผ๋ก ๋ชจ์ด๋๋ก),ย
ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค์๋ ํด๋น ์ ๋ณด๊ฐ ๋ค์ด๊ฐ ์ ์์ด.
๊ฐ์ ๋งคํธ๋ฆญ์ค๋ฅผ ์๋ง์ ์ ์ ์ ์ ์ฉ์์ผ์ค์ผ ํ๋๋ฐ ๊ฑฐ๊ธฐ์ ๊ฑฐ๋ฆฌ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๋ฉด ๋ค๋ฅธ ์ ์ ์์ ์ด์ฉํ ์ ์๊ฑฐ๋ .
(์ ์ด๋ ๋ ๊ทธ๋ ๊ฒ ์ดํดํ์ด)
๊ทธ๋์ ๊ทธ ๊ณ์ฐ์ ๋ฒํ ์ค ํจ์์์ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค๋ฅผ ์ ์ฉํด์ ๊ฐ์ ๋ด๋ณด๋ด๋ฉด,ย ์๋์ผ๋ก w๋ก ๋๋์ด์ ํ๋๊ทธ๋จผํธ ํจ์์ ๋๋ฌํด.
์ ์ i.vertex์ ํด๋ฆฝ์คํ์ด์ค float4๋ฅผ ๋ณด๋๋๋ฐ ํ๋๊ทธ๋จผํธ ํจ์์์ ์ ๋ค๋ฅธ๊ฐ์ด ์ค๋์ง ๋ชฐ๋์๋๋ฐ, clip.w๋ก ๋๋์ด์ ๋๋ฌํ๋๋ผ.
๋์ค
์ฌ๊ธฐ์ clip.z/clip.wย ๊ฐ์ด ๋์ค ๊ฐ์ด๊ณ , ๋ณดํต ์ด๋ฏธ์ง ์ดํํธ ์์ด๋ ์ธ ๋ _CameraDepthTexure์ ๋ค์ด์๋ ๊ทธ ๊ฐ์ด์ผ.
๋ง์ฝ 0~1์ด ์๋๋ผ -1~1์ด ๋์ค๋ OpenGl์ ์ด์ฉ์ค์ด๋ฉด ์๋ง ๋ณํ๋์ 0~1๊ฐ์ผ๋ก ๋ฒํผ์ ๋ค์ด๊ฐ๊ฑฐ์ผ.
ReversedZ๋ฅผ ์ด์ฉํ๋ ์ํ๋๋ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค์ชฝ์ ์ ์ฉ์ด ๋์ด์๊ณ , ํด๋น ์ฌ๋ถ์ ๋ฐ๋ผย clip.z/clip.w๊ฐ ๋ฐํํ๋ ๊ฐ์ด 0~1์ธ์ง, 1~0์ธ์ง๊ฐ ๊ฒฐ์ ๋ผ.
์ฌ๊ธฐ์ ๊ตฌํด์ง ๋์ค๊ฐ์ ์ ํ์ด ์๋์ผ.
clip.z๋ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค๋ฅผ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด a * view.z + b์ด๊ณ , clip.w ๋ -view.z์ผ. ์ฐธ๊ณ ๋ก a๋ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค P[2,2], b๋ P[2,3].
๊ทธ๋ฌ๋๊น, ๋์ค๊ฐ์ -a - b/view.z๋๊น, ๋์ถฉ 1/x ๊ทธ๋ํ๊ฐ ๋์ค๊ฒ ๋ค.
์ด๊ฑธ ์ ํ์ผ๋ก ๋ง๋ค์ด์ฃผ๋ฉด์ ๋์์ ReversedZ๋ ํด๊ฒฐํด์ฃผ๋ ํจ์๊ฐ Linear01Depth์ธ๋ฐ, ์ฌ๊ธฐ๋ถํด ๋ค์์ ๋ดํค๋ฉด ๊ธ ๋ ์ธ๊ฒ.
์๋ ๋ ์ฐ๋ ค ํ๋๋ฐ ์ง์น๋ค.
๋ทฐ ๋งคํธ๋ฆญ์ค์ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค๋ ์ ๋ํฐ์์ ๋ง๋ค์ด๋ดค์ด.
๋ทฐ ๋งคํธ๋ฆญ์ค
๋ทฐ ๋งคํธ๋ฆญ์ค์ ๋ํด์๋ ์ ๋ณด๊ฐ ๊ฑฐ์ ์์ด์ ์ด๊ฒ์ ๊ฒ ํด๋ณด๋ฉด์ ์์๋ธ๊ฑด๋ฐ,ย
์ฐ์ ์ค์ผ์ผ์ 1๋ก ๊ณ ์ ๋ผ. ์นด๋ฉ๋ผ ์ค์ผ์ผ์ ์กฐ์ ํ๋ค๊ณ ํด์ ํ๋ฉด์ ๋น์จ์ด ์กฐ์ ๋์ง ์์์.
๋ค๋ง ์์์ ๋งํ๋ฏ์ด z๊ฐ -1 ๋ฐฉํฅ์ด ์์ด๊ธฐ ๋๋ฌธ์, z ์ค์ผ์ผ์ -1์ด ๋์ด์ผ ํด.
๊ทธ๋์ ์ค์ผ์ผ์ (1,1,-1)
์์น๊ฐ์ ์์์ ํ๋๋๋ก ๋ถ๋ชจ ์ค๋ธ์ ํธ์ ๋งคํธ๋ฆญ์ค๋ฅผ ๊ณฑํด๋๊ฐ๋ฉด ๋ผ. transform.localToWorldMatrix๊ฐ ํด๋น ๋งคํธ๋ฆญ์ค๋ฅผ ๋ฐํํด์ค.ย
๋กํ ์ด์ ๊ฐ๋ ์ญ์ ๋ถ๋ชจ ์ค๋ธ์ ํธ์ ๋กํ ์ด์ ๊ฐ์ ๊ณฑํด๋๊ฐ๋ฉด ๋ผ. Quaternion๋ผ๋ฆฌ ๊ณฑํด์ค.
์ด์ ์ด 3๊ฐ๋ก ๋งคํธ๋ฆญ์ค๋ฅผ ์์ฑํ๋ฉด, ์นด๋ฉ๋ผ ์คํ์ด์ค์์ ์๋ ์คํ์ด์ค๋ก ๋ณด๋ด๋ ๋งคํธ๋ฆญ์ค๊ฐ ์์ฑ๋ผ.
์ฌ๊ธฐ์ inverse๋ฅผ ์ ์ฉ์ํค๋ฉด, worldToCamera ๋งคํธ๋ฆญ์ค๊ฐ ๋์.
ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค
์ ๋ํฐ ๋ด๋ถ์์ ๊ณ์ฐํ ๋, OpenGL์ ํ์์ ์ด์ฉํ๊ณ gpu๋ก ๋ณด๋ด๊ธฐ ์ ์ GL.GetGpuProjectionMatrix()๋ฅผย ์ ์ฉ์์ผ์ค์ผ ๋ผ.
halfWidthNear๋ Near Plane์์์ Width/2 ๊ฐ์ด์ผ.
Tan(์์ผ๊ฐ / 2.0f)ํ๋ฉด ์นด๋ฉ๋ผ๋ก๋ถํฐ ๊ฑฐ๋ฆฌ๊ฐ 1์ธ ์ํ์์์ ํ๋ฉด์ ๊ฐ๋ก ์ ๋ฐย ํฌ๊ธฐ๊ฐ ๋์. ๊ฑฐ๊ธฐ์ near plane ๊ฑฐ๋ฆฌ๋ฅผ ๊ณฑํด์ฃผ๋ฉด NearPlane์์์ Width/2๊ฐ ๋์ค๊ณ .
aspect๋ ๊ฐ๋ก์ธ๋ก ๋น์จ์ด์ผ.
ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค ์์ฒด์ ๋ค์ด๊ฐ๋ ๊ฐ์ ์์งํ ์ด๋ป๊ฒ ์ ๋๋๊ฑด์ง ์์๋ณธ์ ์ด ์๋๋ฐ, ์ด๋ค ๊ฐ์ด ๋ค์ด๊ฐ๋์ง๋ ์ ํด์ ธ ์์ด์ ๊ทธ๋๋ก ๋ฃ์ด์คฌ์ด.
์๋ง๋ Reversed Z๊ฐ ์ ์ฉ๋ ํ๋ก์ ์ ๋งคํธ๋ฆญ์ค. ์ ๋ชจ๋ฅด๊ฒ ์ด.
๊ทธ๋์ ์ด๋ฐ๊ฒ ๊ฐ๋ฐ์ ํ์ํ๊ฐ?
์์ ์์ด๋๋ค ์์ ํ๊ณ ํ๋ก์ ํธ์ ๋ง์ถ๋ ค๋ฉด ํ์ํ๋๋ผ.
2ํธ์ ์์์๋ ์๊ณ ์์์๋ ์์ด
์ด๋ฐ๊ฑฐ ํ ์๊ฐ์ ์ข์์ทจ์ ํฌํด์ฉ ๊ฐ๋ฏธํฅ๊ธฐํค์ฐ๊ธฐ๋ ๋ง๋ค์ด๋ผ
์๋ขฐ๋ฉ๊ฑฐ ์๋์ ๋จธ๋
์์ํ 2ํธ์ ๋ด๋์ผ๋ฉด ์ ํ์ฌํ๋ ์ผ์ด๋์ง ์์ ๊ฒ์ ๋๋ค.