1 Getting started 7 Transformations - JJhuk/LearnOpenGL GitHub Wiki
LearnOpenGL - Transformations
์์ฑ์ผ: 2021๋ 1์ 24์ผ ์ค์ 4:36 ์์ฑ 1: https://learnopengl.com/Getting-started/Transformations
์ด์ ์ฐ๋ฆฌ๋ ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค๊ณ , ์์์ ์ง์ ํ๊ณ , ํ ์ค์ฒ๋ฅผ ์ฌ์ฉํ์ฌ ์ธ๋ถ์ ์ธ ๋ชจ์์ ๋ถ์ฌํ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ง๋ง, ๋ชจ๋ ์ ์ ์ค๋ธ์ ํธ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฏธ๊ฐ ์์ต๋๋ค. ๋ฒํ ์ค๋ฅผ ๋ณ๊ฒฝํ๊ณ ๊ฐ ํ๋ ์์ ๋ฒํผ๋ฅผ ์ฌ๊ตฌ์ฑํ์ฌ ์ด๋ํ๋๋ก ์๋ํ๊ณ ๋ง๋ค ์ ์์ง๋ง, ์ด๋ ๋ฒ๊ฑฐ๋กญ๊ณ ์๋นํ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ด ํ์ํฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ๋ณํํ๋ ํจ์ฌ ๋ ์ข์ ๋ฐฉ๋ฒ์ (์ฌ๋ฌ) ํ๋ ฌ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด๊ฒ์ ๊ฑฐ์ฐฝํ ์๋ฏธ๋ ์๋๋๋ค.
ํ๋ ฌ์ ์ฒ์์๋ ๋ฌด์ญ๊ฒ ๋๊ปด์ง๋ ๋งค์ฐ ๊ฐ๋ ฅํ ์ํ์ ๊ตฌ์กฐ์ด์ง๋ง ์ต์ํด์ง๋ฉด ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ํ๋ ฌ์ ๋ํด ๋ ผ์ํ ๋ ๋ช ๊ฐ์ง ์ํ์ ๋ํด ์ ์ ์ดํด๋ณด์์ผ ํ ๊ฒ์ด๋ฉฐ ๋ ์ณ
๊ทธ๋ฌ๋ ๋ณํ์ ์์ ํ ์ดํดํ๋ ค๋ฉด ๋จผ์ ํ๋ ฌ์ ๋ํด ๋ ผ์ํ๊ธฐ ์ ์ ๋ฒกํฐ์ ๋ํด ์ข ๋ ๊น์ด ์์์ผ ํฉ๋๋ค. ์ด ์ฅ์ ์ด์ ์ ๋์ค์ ํ์ํ ์ฃผ์ ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ํ์ ๋ฐฐ๊ฒฝ์ ์ ๊ณตํ๋ ๊ฒ์ ๋๋ค. ์ฃผ์ ๊ฐ ์ด๋ ค์ด ๊ฒฝ์ฐ ์ต๋ํ ์ดํดํ๋ ค๊ณ ํ๊ณ , ๋์ค์ ์ด ์ฅ์ผ๋ก ๋์์์ ํ์ํ ๋๋ง๋ค ๋ค์ ๋ณด์ญ์์ค.
๋ฒกํฐ
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ์์์ ๋ฒกํฐ๋ ๋ฐฉํฅ์ด๋ฉฐ ๊ทธ ์ด์์ ์์ต๋๋ค. ๋ฒกํฐ์๋ ๋ฐฉํฅ๊ณผ ํฌ๊ธฐ (ํ ๋๋ ๊ธธ์ด๋ผ๊ณ ๋ ํฉ๋๋ค). ๋น์ ์ ๋ณด๋ฌผ์ง๋์ ๊ธธ ์ฐพ๊ธฐ์ ๊ฐ์ ๋ฒกํฐ๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค. : '์ผ์ชฝ์ผ๋ก 10 ๊ฑธ์, ์ด์ ๋ถ์ชฝ์ผ๋ก 3๊ฑธ์, ์ค๋ฅธ์ชฝ์ผ๋ก 5๊ฑธ์' ์ฌ๊ธฐ์ '์ผ์ชฝ'์ ๋ฐฉํฅ์ด๊ณ '10'์ ๋ฒกํฐ์ ํฌ๊ธฐ์ ๋๋ค. ๋ฐ๋ผ์ ๋ณด๋ฌผ์ง๋์ ๋ฐฉํฅ์๋ 3๊ฐ์ ๋ฒกํฐ๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ฒกํฐ๋ ๋ชจ๋ ์ฐจ์์ ๊ฐ์ง ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก 2-4์ฐจ์์ผ๋ก ์์ ํฉ๋๋ค. ๋ฒกํฐ์ 2์ฐจ์์ด ์์ผ๋ฉด ํ๋ฉด์์ ๋ฐฉํฅ์ ๋ํ๋ด๊ณ (2D ๊ทธ๋ํฝ์ ์๊ฐํด๋ณด์ธ์) 3์ฐจ์์ด ์์ผ๋ฉด 3D์ธ๊ณ์ ๋ชจ๋ ๋ฐฉํฅ์ ๋ํ๋ผ ์ ์์ต๋๋ค.
์๋์๋ ๊ฐ ๋ฒกํฐ๊ฐ 2D๊ทธ๋ํ์์ ํ์ดํ๋ก (x, y)
๋ก ํํ๋๋ 3๊ฐ์ ๋ฒกํฐ๊ฐ ์์ต๋๋ค. ๋ฒกํฐ๋ฅผ 3D๊ฐ ์๋ 2D๋ก ํ์ํ๋ ๊ฒ์ด ๋ ์ง๊ด์ ์ด๊ธฐ ๋๋ฌธ์ 2D ๋ฒกํฐ๋ฅผ z
์ขํ๊ฐ 0
์ธ 3D๋ฒกํฐ๋ก ์๊ฐํ ์ ์์ต๋๋ค. ๋ฒกํฐ๋ ๋ฐฉํฅ์ ๋ํ๋ด๋ฏ๋ก ๋ฒกํฐ์ ์์์ ์ ์ค์ํ์ง ์์ต๋๋ค. ์๋ ๊ทธ๋ํ์์ ๋ณผ ์ ์๋ ๋ฒกํฐ $\bar v$ ์ ๋ฒกํฐ $\bar w$์ ์์์ ์ด ๋ค๋ฅด๋๋ผ๋ ๋์ผํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ฒกํฐ๋ฅผ ์ค๋ช ํ ๋ ์ํ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฒกํฐ๋ฅผ ๋จธ๋ฆฌ ์์ ์์ ๋ง๋๊ฐ ์๋ ๋ฌธ์ ๊ธฐํธ๋ก ์ค๋ช ํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. $\bar v$ ๋ํ ๊ณต์์ ๋ฒกํฐ๋ฅผ ํ์ํ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ํ์๋ฉ๋๋ค.
๋ฒกํฐ๋ ๋ฐฉํฅ์ผ๋ก ์ง์ ํ๊ธฐ ๋๋ฌธ์ ์์น๋ก ์๊ฐํํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ๋ฒกํฐ๋ฅผ ์์น๋ก ์๊ฐํํ๋ ค๋ฉด ๋ฐฉํฅ ๋ฒกํฐ์ ์์์ ์ด (0, 0, 0)
์ด ๋๋ ๊ฒ์ ์์ ํ ๋ค์ ์ ์ ์ง์ ํ๋ ํน์ ๋ฐฉํฅ์ ๊ฐ๋ฆฌ์ผ ์์น ๋ฒกํฐ๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๋ค๋ฅธ ์์์ ์ ์
๋ ฅ ํ ๋ค์ '์ด ๋ฒกํฐ๋ ์ด ์์์ ์์ ๊ณต๊ฐ์ ํด๋น ์ง์ ์ ๊ฐ๋ฆฌํต๋๋ค๋ผ๊ณ ๋งํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ์์น ๋ฒกํฐ
(3, 5)๋ ์์ ์ด
(0, 0)์ธ ๊ทธ๋ํ์์
(3, 5)` ๋ฅผ ์นด๋ฆฌํต๋๋ค. ๋ฐ๋ผ์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ์ฌ 2D ๋ฐ 3D ๊ณต๊ฐ์์ ๋ฐฉํฅ ๋ฐ ์์น๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
์ผ๋ฐ ์ซ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฒกํฐ์ ๋ํด ์ฌ๋ฌ ์ฐ์ฐ์ ์ ์ ํ ์๋ ์์ต๋๋ค. (์ผ๋ถ๋ ์ด๋ฏธ ๋ณด์ ๊ฒ๋๋ค.)
์ค์นผ๋ผ ๋ฒกํฐ ์ฐ์ฐ
์ค์นผ๋ผ๋ ํ ์๋ฆฌ ์ซ์์ ๋๋ค. ์ค์นผ๋ผ๋ก ๋ฒกํฐ๋ฅผ ๋ํ๊ธฐ / ๋นผ๊ธฐ / ๊ณฑํ๊ธฐ ๋๋ ๋๋ ๋ ์ฐ๋ฆฌ๋ ๋จ์ํ ๋ฒกํฐ์ ๊ฐ ์์๋ฅผ ์ค์นผ๋ผ๋ก ๋ํ๊ฑฐ๋ / ๋นผ๊ฑฐ๋ / ๊ณฑํ๊ฑฐ๋ ๋๋๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋ํ๋ผ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ +๋ +, โ, โ ๋๋ รท ์ผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ โ ๋ ๊ณฑ์ ์ฐ์ฐ์์ ๋๋ค.
๋ฒกํฐ negation
๋ฒกํฐ๋ฅผ ๋ถ์ (negate)ํ๋ฉด ๋ฐ๋ ๋ฐฉํฅ์ ๋ฒกํฐ๊ฐ ์์ฑ๋ฉ๋๋ค. ๋ถ๋์ชฝ์ ๊ฐ๋ฆฌํค๋ ๋ฒกํฐ๋ฅผ ๋ถ์ ํ ํ ๋จ์์ชฝ์ผ๋ก ๊ฐ๋ฆฌํต๋๋ค. ๋ฒกํฐ๋ฅผ ๋ถ์ ํ๊ธฐ ์ํด ๊ฐ ๊ตฌ์ฑ ์์์ ๋ง์ด๋์ค ๋ถํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค. (์ค์นผ๋ผ ๊ฐ์ด -1
์ธ ์ค์นผ๋ผ ๋ฒกํฐ ๊ณฑ์
์ผ๋ก๋ ๋ํ๋ผ ์ ์์ต๋๋ค.)
๋ง์ ๊ณผ ๋บ์
๋ ๋ฒกํฐ์ ๋ง์ ์ ๊ตฌ์ฑ ์์๋ณ๋ก์ ๋ง์ ์ผ๋ก ์ ์๋ฉ๋๋ค. ์ฆ, ํ ๋ฒกํฐ์ ๊ฐ ๊ตฌ์ฑ์์๊ฐ ๋ค์๊ณผ ๊ฐ์ด ๋ค๋ฅธ ๋ฒกํฐ์ ๋์ผํ ๊ตฌ์ฑ ์์์ ์ถ๊ฐ๋ฉ๋๋ค.
์๊ฐ์ ์ผ๋ก ๋ฒกํฐ v = (4,2)
์ k = (1,2)
์์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์
๋๋ค. ๋ ๋ฒ์งธ ๋ฒกํฐ๋ ์ฒซ ๋ฒ์งธ ๋ฐฑํฐ์ ๋์ ์ถ๊ฐ๋์ด ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฒกํฐ๋ฅผ ๋์ ์ ์ฐพ์ต๋๋ค. (ํค๋-ํฌ-ํ
์ผ ๋ฐฉ๋ฒ)
์ผ๋ฐ ๋ง์ ๋ฐ ๋บ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฒกํฐ ๋บ์ ์ ๋ถ์ ๋ ๋ ๋ฒ์งธ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ ๋ง์ ๊ณผ ๋์ผํฉ๋๋ค.
๋ ๋ฒกํฐ๋ฅผ ์๋ก ๋นผ๋ฉด ๋ ๋ฒกํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ์์น์ ์ฐจ ์ธ ๋ฒกํฐ๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด๋ ๋ ์ ๊ฐ์ ๋ฒกํฐ๋ฅผ ๋ํ๋ด๋ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
๊ธธ์ด
๋ฒกํฐ์ ๊ธธ์ด / ํฌ๊ธฐ๋ฅผ ์๊ธฐ์ํด ์ํ ์์
์์ ๋ฐฐ์ ๋ ํผํ๊ณ ๋ผ์ค ์ ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ฒกํฐ๋ ๊ฐ๋ณ x
๋ฐ y
๊ตฌ์ฑ ์์๋ฅผ ์ผ๊ฐํ์ ๋ ๋ณ์ผ๋ก ์๊ฐํ ํ๋ฉด ์ผ๊ฐํ์ ํ์ฑํฉ๋๋ค.
๋ ๋ณ์ ๊ธธ์ด (x, y)
๋ฅผ ์๊ณ ์๊ณ ๊ธฐ์ธ์ด ์ง ๋ณ์ ๊ธธ์ด๋ฅผ ์๊ณ ์ถ๊ธฐ ๋๋ฌธ์ ํผํ๊ณ ๋ผ์ค ์ ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์๊ณผ ๊ฐ์ด ๊ณ์ฐํ ์ ์์ต๋๋ค.
$\lVert\bar{v}\rVert$ ์ด๊ฒ์ ๋ฒกํฐ $\bar{v}$์ ๊ธธ์ด๋ก ํ์ํฉ๋๋ค. ์ด๊ฒ์ ๋ฐฉ์ ์์ $z^2$๋ฅผ ์ถ๊ฐํ์ฌ 3D๋ก ์ฝ๊ฒ ํ์ฅ๋ฉ๋๋ค.
์ด ๊ฒฝ์ฐ์ ๋ฒกํฐ (4, 2)
์ ๊ธธ์ด๋
4.47
์
๋๋ค.
๋จ์ ๋ฒกํฐ๋ผ๊ณ ๋ถ๋ฅด๋ ํน๋ณํ ์ ํ์ ๋ฒกํฐ๋ ์์ต๋๋ค. ๋จ์ ๋ฒกํฐ์๋ ํ๋์ ์ถ๊ฐ ์์ฑ์ด ์ด์ ๋ฉฐ ๊ธธ์ด๋ ์ ํํ 1์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๋ฒกํฐ์ ๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ๊ธธ์ด๋ก ๋๋์ด ๋ชจ๋ ๋ฒกํฐ์์ ๋จ์ ๋ฒกํฐ๋ฅผ ๊ณ์ฐํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ฒกํฐ ์ ๊ทํ(Nomalizing) ๋ผ๊ณ ํฉ๋๋ค. ๋จ์ ๋ฒกํฐ๋ ๋จธ๋ฆฌ ์์ ์์ ์ง๋ถ์ผ๋ก ํ์๋๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ์์ ํ๊ธฐ ๋ ์ฝ์ต๋๋ค. ํนํ ๋ฐฉํฅ๋ง ์ ๊ฒฝ์ฐ๋ ๊ฒฝ์ฐ (๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๋ณ๊ฒฝํ๋๋ผ๋, ๋ฐฉํฅ์ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.)
๋ฒกํฐ๊ฐ์ ๊ณฑ์
๋ ๋ฒกํฐ๋ฅผ ๊ณฑํ๋ ๊ฒ์ ์ด์ํ ๊ฒฝ์ฐ์ ๋๋ค. ์ ๊ท ๊ณฑ์ ์ ์๊ฐ์ ์๋ฏธ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๋ฒกํฐ์์ ์ ์๋์ง ์์ง๋ง ๊ณฑํ ๋ ์ ํํ ์ ์๋ ๋ ๊ฐ์ง ํน์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ํ๋๋ $\vec x\cdot\vec y$๋ก ํ์๋ ๋ด์ ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ $\vec x * \vec y$ ๋ก ํ์๋ ์ธ์ ์ ๋๋ค.
๋ด์ (Dot product)
๋ ๋ฒกํฐ๋ฅผ ๋ด์ ํ๋ค๋ ๊ฒ์ ๊ฐ ๋ฒกํฐ ์ฌ์ด์ ์ฝ์ฌ์ธ๊ณผ ๊ฐ ๊ธธ์ด์ ์ค์นผ๋ผ๋ฅผ ๊ณฑํ๋๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ด ๋ง์ด ์ ์ดํด๊ฐ ๊ฐ์ง ์๋๋ค๋ฉด ๋ค์ ๊ณต์์ ๋ณด์ธ์.
๊ฐ ๋ฒกํฐ ์ฌ์ด์ ๊ฐ๋๋ ์ธํ $(\theta)$๋ก ํ์๋ฉ๋๋ค. ์ด๊ฒ์ด ํฅ๋ฏธ๋ก์ด ์ด์ ๋, $\bar{v}$์ $\bar{k}$๊ฐ ๋จ์ ๋ฒกํฐ๋ผ๊ณ ๊ฐ์ ํ๋ฉด ๊ธธ์ด๊ฐ 1์ผ๊ฒ์ ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ด ํจ์จ์ ์ผ๋ก ์ค์ผ ์ ์์ต๋๋ค.
์ด์ ๋ด์ ๋ง์ด ๋ ๋ฐฑํฐ ์ฌ์ด์ ๊ฐ๋๋ฅผ ์ ์ํฉ๋๋ค. ์ฝ์ฌ์ธํจ์๋ ๊ฐ๋๊ฐ 90๋๋ฉด 0
์ด ๋๊ณ ๊ฐ๋๊ฐ 0์ด๋ฉด 1
์ด ๋๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ด์ ์ ์ฌ์ฉํ์ฌ ๋ ๋ฒกํฐ๊ฐ ์๋ก ์ง๊ตํ๋์ง, ํํํ์ง ์ฝ๊ฒ ์ ์ ์์ต๋๋ค. (์ง๊ต๋ ๋ฒกํฐ๊ฐ ์๋ก ์ง๊ฐ์ ์์์ ์๋ฏธํฉ๋๋ค.) sin
๋๋ cos
ํจ์์ ๋ํด ๋ ์๊ณ ์ถ๋ค๋ฉด ์นธ ์์นด๋ฐ๋ฏธ ๋์์ ์์ ๊ธฐ๋ณธ ์ผ๊ฐ๋ฒ์ ๋ํด ์ค๋ช
ํฉ๋๋ค.
๋๊ฐ์ ๋จ์๋ฒกํฐ๊ฐ ์๋ ๋ฒกํฐ ์ฌ์ด์ ๊ฐ๋๋ฅผ ๊ณ์ฐํ ์ ์์ง๋ง ๊ฒฐ๊ณผ์์ ๋ ๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ๋๋์ด $cos\theta$๋ก ๋จ๊ฒจ์ผ ํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ด์ ์ ์ด๋ป๊ฒ ๊ณ์ฐํ ๊น์? ๋ด์ ์ ๊ตฌ์ฑ ์์ ๋ณ ๊ณฑ์
์ ๊ฒฐ๊ณผ๋ฅผ ๋ํ๋ ๊ฒ์
๋๋ค. ๋ ๊ฐ์ ๋จ์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค (๋ ๊ธธ์ด ๋ชจ๋ ์ ํํ 1
์ธ์ง ํ์ธํ ์ ์์.)
์ด ๋ ๋จ์ ๋ฒกํฐ ์ฌ์ด์ ๊ฐ๋๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ์ฝ์ฌ์ธ ํจ์์ ์ญ์ธ $cos^{-1}$ ์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ์ ์ผ๋ก 143.1
๋๊ฐ ๋ฉ๋๋ค. ์ด์ ์ด ๋ ๋ฒกํฐ ์ฌ์ด์ ๊ฐ๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ณ์ฐํ์ต๋๋ค. ๋ด์ ์ ๋์ค์ ์กฐ๋ช
๊ณ์ฐ์ ํ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ธ์ (Cross product)
์ธ์ ์ 3D๊ณต๊ฐ์์๋ง ์ ์๋๋ฉฐ ๋ ๊ฐ์ ํํํ์ง ์์ ๋ฒกํฐ๋ฅผ ์ ๋ ฅ์ผ๋ก ์ฌ์ฉํ๊ณ , ๋ ์ ๋ ฅ ๋ฒกํฐ์ ์ง๊ตํ๋ ์ธ ๋ฒ์งธ ๋ฒกํฐ๋ฅผ ์ป์ต๋๋ค. ๋ ์ ๋ ฅ ๋ฒกํฐ๊ฐ ์๋ก ์ง๊ตํ๋ฉด ์ธ์ ์ 3๊ฐ์ ์ง๊ต ๋ฒกํฐ๊ฐ ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ค์ ์ฅ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ค์ ์ด๋ฏธ์ง๋ ์ด๊ฒ์ด 3D๊ณต๊ฐ์์ ์ด๋ป๊ฒ ๋ณด์ด๋์ง ๋ณด์ฌ์ค๋๋ค.
๋ค๋ฅธ ์ฐ์ฐ๊ณผ ๋ฌ๋ฆฌ ์ธ์ ์ ์ ํ ๋์๋ฅผ ๊ณต๋ถํ์ง ์๊ณ ๋ ์ง๊ด์ ์ด์ง ์์ผ๋ฏ๋ก ๊ณต์์ ์ธ์ฐ๋ ๊ฒ์ด ๊ฐ์ฅ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค.(๊ทธ๋ ์ง ์๋ค๋ฉด ๋์ค์ ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค.) ์๋์์ ๋ ์ง๊ต ๋ฒกํฐ A์ B ์ฌ์ด์ ์ธ์ ์ ๋ณผ ์ ์์ต๋๋ค.
๋ณด์๋ค์ํผ ์๋ฟ์ง ์์ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋จ๊ณ๋ง ๋ฐ๋ฅด๋ฉด ์ง๊ตํ๋ ๋ ๋ค๋ฅธ ๋ฒกํฐ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
ํ๋ ฌ(Matrices)
์ด์ ๋ฒกํฐ์ ๋ํ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ ์์๋ดค์ผ๋ฏ๋ก ํ๋ ฌ์ ๋ค์ด๊ฐ ์๊ฐ์ ๋๋ค! ํ๋ ฌ์ ์ซ์, ๊ธฐํธ ๋ฐ/๋๋ ์ํ ํํ์์ ์ง์ฌ๊ฐํ ๋ฐฐ์ด์ ๋๋ค. ํ๋ ฌ์ ๊ฐ ๊ฐ๋ณ ํญ๋ชฉ์ ํ๋ ฌ์ ์์(element)๋ผ๊ณ ํฉ๋๋ค. 2x3 ํ๋ ฌ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ ฌ์ (i, j)
์ ์ํด ์ธ๋ฑ์ฑ๋ฉ๋๋ค. ์ฌ๊ธฐ์ i
๋ ํ์ด๊ณ j
๋ ์ด์
๋๋ค. ๋ฐ๋ผ์ ์ ํ๋ ฌ์ 2x3 ํ๋ ฌ (์ด 3๊ฐ์ ํ2๊ฐ, ํ๋ ฌ์ ์ฐจ์(dimension) ์ด๋ผ๊ณ ๋ ํจ) ์ด๋ผ๊ณ ํฉ๋๋ค. ์ด๊ฒ์ 2D ๊ทธ๋ํ๋ฅผ (x, y)
๋ก ์ธ๋ฑ์ฑ ํ ๋์๋ ๋ฐ๋์
๋๋ค. ๊ฐ 4๋ฅผ ๊ฒ์ํ๋ ค๋ฉด (2, 1)
(๋ ๋ฒ์งธ ํ, ์ฒซ ๋ฒ์งธ ์ด)๋ก ์์ธ์ ์์ฑํฉ๋๋ค.
ํ๋ ฌ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ ํํ์์ ์ง์ฌ๊ฐํ ๋ฐฐ์ด์ผ ๋ฟ์ ๋๋ค. ๊ทธ๊ฒ์ ๋งค์ฐ ์ข์ ์ํ์ ์ฑ์ง๋ค์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ๋ฒกํฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ๋ ฌ์ ๋ํ ์ฌ๋ฌ ์ฐ์ฐ ์ฆ, ๋ํ๊ธฐ, ๋นผ๊ธฐ ๋ฐ ๊ณฑํ๊ธฐ๋ฅผ ์ ์ํ ์ ์์ต๋๋ค.
๋ง์ ๊ณผ ๋บ์
๋ ํ๋ ฌ ์ฌ์ด์ ๋ํ๊ธฐ ๋ฐ ๋นผ๊ธฐ๋ ์์๋ณ๋ก ์ํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ ์ซ์์ ๋ํด ์ฐ๋ฆฌ๊ฐ ์ต์ํ ๋์ผํ ๊ท์น์ด ์ ์ฉ๋์ง๋ง ๋์ผํ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง ๋ ํ๋ ฌ์ ์์์ ๋ํด์ ์ํ๋ฉ๋๋ค. ์ด๊ฒ์ ๋ํ๊ธฐ์ ๋นผ๊ธฐ๊ฐ ๊ฐ์ ์ฐจ์์ ํ๋ ฌ์ ๋ํด์๋ง ์ ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. 3x2 ํ๋ ฌ๊ณผ 2x3 ํ๋ ฌ (๋๋ 3x3 ํ๋ ฌ 4x4 ํ๋ ฌ)์ ํจ๊ป ๋ํ๊ฑฐ๋ ๋บ ์ ์์ต๋๋ค. ๋ ๊ฐ์ 2x2 ํ๋ ฌ์์ ํ๋ ฌ ๋ง์ ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
ํ๋ ฌ ๋บ์ ์์๋ ๋์ผํ ๊ท์น์ด ์ ์ฉ๋ฉ๋๋ค.
ํ๋ ฌ ์ค์นผ๋ผ ๊ณฑ
ํ๋ ฌ-์ค์นผ๋ผ ๊ณฑ์ ํ๋ ฌ์ ๊ฐ ์์๋ฅผ ์ค์นผ๋ผ๋ก ๊ณฑํฉ๋๋ค.
์ด์ ์ด๋ฌํ ๋จ์ผ ์ซ์๋ฅผ ์ค์นผ๋ผ๋ผ๊ณ ๋ถ๋ฅด๋ ์ด์ ๋ ์ดํด๊ฐ ๋ฉ๋๋ค. ์ค์นผ๋ผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ ฌ์ ๋ชจ๋ ์์๋ฅผ ๊ฐ์ผ๋ก ์ค์ผ์ผ ํฉ๋๋ค. ์ด์ ์์์์ ๋ชจ๋ ์์๋ 2
๋ก ํ์ฅ๋์์ต๋๋ค.
์ง๊ธ๊น์ง ์ฐ๋ฆฌ์ ๋ชจ๋ ์์๋ ๊ทธ๋ ๊ฒ ๋ณต์กํ์ง ์์ต๋๋ค. ํ๋ ฌ๊ฐ์ ๊ณฑ์ ์ ์์ํ๊ธฐ ์ ๊น์ง๋์.
ํ๋ ฌ๊ฐ ๊ณฑ์
ํ๋ ฌ์ ๊ณฑํ๋ ๊ฒ์ ๋ฐ๋์ ๋ณต์กํ์ง๋ ์์ง๋ง, ์ต์ํด์ง๊ธฐ ์ด๋ ต์ต๋๋ค. ํ๋ ฌ ๊ณฑ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณฑํ ๋ ๋ฏธ๋ฆฌ ์ ์๋ ๊ท์น๋ค์ ๋ฐ๋ฅด๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ํ์ง๋ง ๋ช ๊ฐ์ง ์ ํ ์ฌํญ์ด ์์ต๋๋ค.
- ์ข๋ณ ํ๋ ฌ์ ์ด ์๊ฐ ์ฐ๋ณ ํ๋ ฌ์ ํ ์์ ๊ฐ์ ๊ฒฝ์ฐ์๋ง ๋ ํ๋ ฌ์ ๊ณฑํ ์ ์์ต๋๋ค.
- ํ๋ ฌ ๊ณฑ์ ์ ๊ตํ๋ฒ์น์ด ์ฑ๋ฆฝํ์ง ์์ต๋๋ค. $A\cdot{B}\not = B\cdot{A}$
2๊ฐ์ 2x2
ํ๋ ฌ์ ํ๋ ฌ ๊ณฑ์
์ ์๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค.
์ง๊ธ ๋น์ ์ ๋๋์ฒด ๋ฌด์จ ์ผ์ด ์ผ์ด ๋ฌ๋์ง ์์๋ด๋ ค๊ณ ํ ๊ฒ ์ ๋๋ค. ํ๋ ฌ ๊ณฑ์ ์ ์ผ์ชฝ ํ๋ ฌ์ ํ๊ณผ ์ค๋ฅธ์ชฝ ํ๋ ฌ์ ์ด์ ์ฌ์ฉํ๋ ์ผ๋ฐ ๊ณฑ์ ๊ณผ ๋ง์ ์ ์กฐํฉ์ ๋๋ค. ๋ค์ ์ด๋ฏธ์ง๋ก ์ด์ ๋ํด ๋ ผ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ์ผ์ชฝ ํ๋ ฌ์ ์์ชฝ ํ์ ๊ฐ์ ธ์จ ๋ค์ ์ค๋ฅธ์ชฝ ํ๋ ฌ์ ์ด์ ๊ฐ์ ธ์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ ํํ ํ๊ณผ ์ด์ ๊ณ์ฐํ ๊ฒฐ๊ณผ 2x2 ํ๋ ฌ์ด ๋์ต๋๋ค. ์ผ์ชฝ ํ๋ ฌ์ ์ฒซ ๋ฒ์งธ ํ์ ๊ฐ์ ธ ์ค๋ฉด ๊ฒฐ๊ณผ ๊ฐ์ด ๊ฒฐ๊ณผ ํ๋ ฌ์ ์ฒซ ๋ฒ์งธ ํ์ด ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด์ ์ ํํ๊ณ ์ฒซ ๋ฒ์งธ ์ด์ด๋ฉด ๊ฒฐ๊ณผ ๊ฐ์ด ๊ฒฐ๊ณผ ํ๋ ฌ์ ์ฒซ ๋ฒ์งธ ์ด์ด ๋ฉ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ๋นจ๊ฐ์ ๊ฒฝ๋ก์ ๊ฒฝ์ฐ์ ๋๋ค. ์ค๋ฅธ์ชฝ ํ๋จ ๊ฒฐ๊ณผ๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด ์ฒซ ๋ฒ์งธ ํ๋ ฌ์ ๋งจ ์๋ ํ๊ณผ ๋ ๋ฒ์งธ ํ๋ ฌ์ ๋งจ ์ค๋ฅธ์ชฝ ์ด์ ์ฌ์ฉํฉ๋๋ค.
๊ฒฐ๊ณผ ๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ํด ์ ๊ท ๊ณฑ์ ์ ์ฌ์ฉํ์ฌ ํ๊ณผ ์ด์ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๊ณฑํ๊ณ ๋ ๋ฒ์งธ ์์, ์ธ ๋ฒ์งธ, ๋ค ๋ฒ์งธ ๋ฑ์ ๋ํด ๋์ผํ ์์ ์ ์ํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ๋ณ ๊ณฑ์ ์ ๊ฒฐ๊ณผ๊ฐ ํฉ์ฐ๋๊ณ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค. ์ด์ ์๊ตฌ ์ฌํญ ์ค ํ๋๋ ์ผ์ชฝ์ ํ๋ ฌ์ ์ด๊ณผ ์ค๋ฅธ์ชฝ ํ๋ ฌ์ ํ ํฌ๊ธฐ๊ฐ ๊ฐ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ณฑ์ ์ ์งํํ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ๋ ์ฐจ์์ด (n,m)
์ธ ํ๋ ฌ์
๋๋ค. ์ฌ๊ธฐ์ n
์ ์ข๋ณ ํ๋ ฌ์ ํ ์์ ๊ฐ๊ณ m
์ ์ฐ๋ณ ํ๋ ฌ์ ์ด๊ณผ ๊ฐ์ต๋๋ค.
์์ฐ์ผ๋ก ํ๋ ฌ์ ๊ณฑ์ ์ด ์ด๋ ต๋ค๊ณ ๊ฑฑ์ ํ์ง ๋ง์ธ์. ์์ผ๋ก ๊ณ์ฐ์ ํ๊ณ ๋ฌธ์ ๊ฐ ์์๋๋ง๋ค ์ด ํ์ด์ง๋ก ๋์์ค์ธ์. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋น์ ์๊ฒ ๋๋ฒ์งธ๋ก ์์ฐ์ค๋ฌ์ ์ง ๊ฒ์ ๋๋ค.
๋ ํฐ ์์ ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ ฌ๊ฐ์ ๊ณฑ์ ์ ๋ํ ๋ ผ์๋ฅผ ๋ง์นฉ๋๋ค. ์์์ ์ฌ์ฉํ์ฌ ํจํด์ ์๊ฐํ ํ์ญ์์ค. ์ ์ฉํ ์ฐ์ต๋ฐฉ๋ฒ์ผ๋ก, ์์ ์ ๊ณฑ์ ์ ๋ํ ๋ต์ ์๊ฐ ํด๋ธ ๋ค์ ๊ฒฐ๊ณผ ํ๋ ฌ๊ณผ ๋น๊ตํ์ฌ ๋ง๋์ง ํ์ธํ์ญ์์ค. (ํ๋ ฌ ๊ณฑ์ ์ ์์ผ๋ก ์๋ํด๋ณด๋ฉด ๊ธ๋ฐฉ ์ดํดํ ์ ์์ต๋๋ค.)
๋ณด์๋ค์ํผ, ํ๋ ฌ๊ฐ์ ๊ณฑ์ ์ ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ด ๊ณผ์ ์ด๋ฉฐ ๊ณ์ฐ ์ค์๊ฐ ๋ฐ์ํ๊ธฐ ๋งค์ฐ ์ฝ์ต๋๋ค. (์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ปดํจํฐ์๊ฒ ์ด ์์ ์ ์ํํ๋๋ก ํ๋ ์ด์ ์ ๋๋ค.) ํ๋ ฌ์ด ์ปค์ง๋ฉด ๋ ์ค์ํ๊ธฐ ์ฝ์ต๋๋ค. ์ฌ์ ํ ๋ ๋ง์๊ฒ์ ๊ฐ๋งํ๊ณ ํ๋ ฌ์ ์ํ์ ์์ฑ์ ๋ํค ๋ ๊ถ๊ธํ๋ค๋ฉด ํ๋ ฌ์ ๋ํ ์นธ ์์นด๋ฐ๋ฏธ ๋์์์ ์ดํด๋ณด์๊ธฐ ๋ฐ๋๋๋ค.
์ด์จ๋ , ์ด์ ์ฐ๋ฆฌ๋ ํ๋ ฌ์ ํจ๊ป ๊ณฑํ๋ ๋ฐฉ๋ฒ์ ์์์ผ๋ฏ๋ก ์ข์ ๊ฒ์ ์ป์ ์ ์์ต๋๋ค.
Matrix-Vector multiplication
์ด๋๊น์ง ์ฐ๋ฆฐ ์ ๋ฒ ๋ง์ด ๋ฒกํฐ๋ฅผ ๋ค๋ฃจ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ขํ, ์ ์ฌ์ง์ด ํ
์ค์ณ ์ขํ๋ฅผ ํํํ๊ธฐ ์ํด ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ ๊ฒ์
๋๋ค. ์กฐ๊ธ ๋ ๊น๊ฒ ๋์๊ฐ ๋ฒกํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก Nx1
ํ๋ ฌ์ด๋ฉฐ, ์ฌ๊ธฐ์ N
์ ๋ฒกํฐ์ ๊ตฌ์ฑ ์์ ์ (N ์ฐจ์ ๋ฒกํฐ๋ผ๊ณ ๋ ํจ) ์
๋๋ค. ์๊ฐํด๋ณด๋ฉด ๋ง์ด ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฒกํฐ๋ ์ด์ด 1๊ฐ๋ฐ์ ์๋ ์ซ์ ๋ฐฐ์ด์ธ ํ๋ ฌ์ผ ๋ฟ์
๋๋ค . ๊ทธ๋ ๋ค๋ฉด ์ด ์๋ก์ด ์ ๋ณด๊ฐ ์ฐ๋ฆฌ์๊ฒ ์ด๋ป๊ฒ ๋์์ด ๋ ๊น์? ์.. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ MxN
ํ๋ ฌ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด ํ๋ ฌ์ ์ด์ด ๋ฒกํฐ์ ํ ์์ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ด ํ๋ ฌ์ Nx1
๋ฒกํฐ์ ๊ณฑํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ๋ ฌ ๊ณฑ์
์ด ์ ์๋ฉ๋๋ค.
ํ์ง๋ง ํ๋ ฌ์ ๋ฒกํฐ๋ฅผ ๊ณฑํ ์ ์๋์ง ์ ์ ๊ฒฝ์ ์จ์ผํ ๊น์? ์, ํ๋ ฌ ๋ด๋ถ์ ๋ฐฐ์นํ ์ ์๋ ํฅ๋ฏธ๋ก์ด 2D/3D ๋ณํ์ด ๋ง์ด ์๊ณ ๊ทธ ํ๋ ฌ์ ๋ฒกํฐ์ ๊ณฑํ ๋ค์ ๊ทธ ๋ฒกํฐ๋ฅผ ๋ณํ(transforms) ํฉ๋๋ค. ์ฌ์ ํ ํผ๋์ค๋ฝ๋ค๋ฉด ๋ช ๊ฐ์ง ์๋ถํฐ ์์ํด๋ณด๋ฉด ๊ณง ์๋ฏธ๋ฅผ ์ ์ ์์ ๊ฒ์ ๋๋ค.
๋จ์ ํ๋ ฌ Identity matrix
OpenGL์์ ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ๊ฐ์ง ์ด์ ๋ก 4x4
๋ณํ ํ๋ ฌ๋ก ์์
ํ๋ฉฐ ๊ทธ ์ค ํ๋๋ ๋๋ถ๋ถ ๋ฒกํฐ์ ํฌ๊ธฐ๊ฐ 4๋ผ๋ ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ๊ฐ์ฅ ๊ฐ๋จํ ๋ณํ ํ๋ ฌ์ ๋จ์ ํ๋ ฌ์
๋๋ค. ๋จ์ ํ๋ ฌ์ ๋๊ฐ์ ์ ์ ์ธํ๊ณ 0๋ง ์๋ NxN
ํ๋ ฌ์
๋๋ค. ๋ณด์๋ค์ํผ ์ด ๋ณํ ํ๋ ฌ์ ๋ฒกํฐ๋ฅผ ์์์ํค์ง ์์ต๋๋ค.
๋ฒกํฐ๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค. ์ด๊ฒ์ ๊ณฑ์ ๊ท์น์์ ํ์ธํ ์ ์์ต๋๋ค. ์ฒซ ๋ฒ์งธ ๊ฒฐ๊ณผ ์์๋ ํ๋ ฌ์ ์ฒซ ๋ฒ์งธ ํ์ ๊ฐ ๊ฐ๋ณ ์์์ ๋ฒกํฐ์ ๊ฐ ์์๋ฅผ ๊ณฑํ ๊ฒ์ ๋๋ค. ํ์ ๊ฐ ์์๋ ์ฒซ ์์๋ฅผ ์ ์ธํ๊ณ 0์ด๋ฏ๋ก, $1\cdot1+0\cdot2+0\cdot3+0\cdot4=1$ ๋ค์๊ณผ ๊ฐ์ ์์ ์ป์ ์ ์์ต๋๋ค. ๋ฒกํฐ์ ๋ค๋ฅธ 3 ์์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค.
๋ณํํ์ง ์๋ ๋ณํ ํ๋ ฌ์ ์ฉ๋๊ฐ ๋ฌด์์ธ์ง ๊ถ๊ธํ ์ ์์ต๋๋ค. ๋จ์ ํ๋ ฌ์ ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๋ณํ ํ๋ ฌ์ ์์ฑํ๊ธฐ ์ํ ์์์ ์ด๋ฉฐ ์ ํ ๋์๋ฅผ ๋ ๊น์ด ํ๊ณ ๋ค๋ฉด ์ ๋ฆฌ๋ฅผ ์ฆ๋ช ํ๊ณ ์ ํ ๋ฐฉ์ ์์ ํธ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ ํ๋ ฌ์ ๋๋ค.
์ค์ผ์ผ๋ง Scaling
๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ๋ ํ์ดํ์ ๊ธธ์ด๋ฅผ ์ํ๋ ๋งํผ ๋๋ฆฌ๊ณ ๋ฐฉํฅ์ ๋์ผํ๊ฒ ์ ์งํฉ๋๋ค. ์ฐ๋ฆฌ๋ 2์ฐจ์ ๋๋ 3์ฐจ์์์ ์์
ํ๊ธฐ ๋๋ฌธ์ 2๊ฐ ๋๋ 3๊ฐ์ ์ค์ผ์ผ๋ง ๋ณ์๋ก ๊ตฌ์ฑ๋ ๋ฒกํฐ๋ก ์ค์ผ์ผ๋ง์ ์ ์ ํ ์ ์์ผ๋ฉฐ, ๊ฐ ์ค์ผ์ผ๋ง์ ํ๋์ ์ถ (x
, y
๋๋ z
) ์
๋๋ค.
๋ฒกํฐ $\bar{v} = (3,2)$ ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํด ๋ด
์๋ค. x์ถ์ ๋ฐ๋ผ ๋ฒกํฐ์ ๋ฐฐ์จ์ 0.5๋ก ์กฐ์ ํ์ฌ ๋ ๋ฐฐ๋ก ์ข๊ฒ ๋ง๋ญ๋๋ค. y์ถ์ ๋ฐ๋ผ ๋ฒกํฐ์ ํฌ๊ธฐ๋ฅผ 2๋ฐฐ ์กฐ์ ํ์ฌ ๋๋ฐฐ๋ก ๋์
๋๋ค. ์ค์ผ์ผ ํ ๋ฒกํฐ (0.5, 2)
์ฆ $\bar{s}$ ๋ฒกํฐ๊ฐ ์ด๋ป๊ฒ ์๊ฒผ๋์ง ํ๋ฒ ๋ด
์๋ค.
OpenGL์ ์ผ๋ฐ์ ์ผ๋ก 3D๊ณต๊ฐ์์ ์๋ํ๋ฏ๋ก 2D์ผ ๊ฒฝ์ฐ z์ถ ๋ฐฐ์ด์ 1
๋ก ์ค์ ํ์ฌ ์์
ํ ์ ์์ต๋๋ค. ๋ฐฉ๊ธ ์ํ ํ ์ค์ผ์ผ๋ง ์์
์ ์ค์ผ์ผ๋ง ๊ณ์๊ฐ ๊ฐ ์ถ์ ๋ํด ๋์ผํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ท ์ผํ์ง ์๋ ์ค์ผ์ผ(non-Uniform scale)์
๋๋ค. ์ค์นผ๋ผ๊ฐ ๋ชจ๋ ์ถ์์ ๊ฐ์ผ๋ฉด ๊ท ์ผ ์ค์ผ์ผ(Uniform Scale) ์ด๋ผ๊ณ ํฉ๋๋ค.
์ค์ผ์ผ๋ง์ ์ํํ๋ ๋ณํ ๋งคํธ๋ฆญ์ค๋ฅผ ๊ตฌ์ถํด ๋ณด๊ฒ ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋จ์ ํ๋ ฌ์์ ๊ฐ ๋๊ฐ์ ์์์ ํด๋น ๋ฒกํฐ ์์๋ฅผ ๊ณฑํ ๊ฒ์ ๋ณด์์ต๋๋ค. ๋จ์ ํ๋ ฌ์ 1
์ 3
์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ด๋จ๊น์? ์ด ๊ฒฝ์ฐ ๊ฐ ๋ฒกํฐ ์์์ 3
์ ๊ณฑํ์ฌ ๋ฒกํฐ์ 3์ ํจ๊ณผ์ ์ผ๋ก ๊ท ์ผํ๊ฒ(Uniform) ์ค์ผ์ผํฉ๋๋ค. ์ค์ผ์ผ๋ง ๋ณ์$(S_1,S_2,S_3)$๋ก ํํํ๋ฉด ๋ชจ๋ ๋ฒกํฐ$(x,y,z)$์ ๋ํ ์ค์ผ์ผ๋ง ํ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ํ ์ ์์ต๋๋ค.
4๋ฒ์จฐ ์ค์ผ์ผ๋ง ๊ฐ 1
์ ์ ์งํฉ๋๋ค. w
๊ตฌ์ฑ ์์๋ ๋์ค์ ์ดํด๋ณผ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉ๋ฉ๋๋ค.
Translation
Translation์ ์๋ ๋ฒกํฐ ์์ ๋ค๋ฅธ ๋ฒกํฐ๋ฅผ ์ถ๊ฐํ์ฌ ์์น๊ฐ ๋ค๋ฅธ ์ ๋ฒกํฐ๋ฅผ ๋ฐํํ์ฌ ์ด๋ ๋ฒกํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฒกํฐ๋ฅผ ์ด๋ ํ๋ ๊ณผ์ ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ฒกํฐ์ ๋ง์ ์ ๋ํด ๋ ผ์ ํ์ผ๋ฏ๋ก ์ด๊ฒ์ ์ฒ์๋ณด๋ ๊ฒ์ฒ๋ผ ๋๋ผ๋ฉด ์๋ฉ๋๋ค.
์ค์ผ์ผ๋ง ํ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก 4x4 ํ๋ ฌ์๋ ํน์ ์์ ์ ์ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ฌ๋ฌ ์์น๊ฐ ์์ผ๋ฉฐ ๋ณํ์ ์ํด 4๋ฒ์งธ ์ด์ ์์ 3๊ฐ ๊ฐ์ด ์์ต๋๋ค. ์ด๋ ๋ฒกํฐ๋ฅผ$(T_x,T_y,T_z)$๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ด๋ ํ๋ ฌ์ ์ ์ํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๋ชจ๋ ๋ณํ ๊ฐ์ ๋ฒกํฐ์ w
์ด์ ๊ณฑํ๊ณ ๋ฒกํฐ์ ์๋ ๊ฐ์ ๋ํ๊ธฐ ๋๋ฌธ์ ์๋ํฉ๋๋ค. (ํ๋ ฌ ๊ณฑ์
๊ท์น์ ๋ ์ฌ๋ฆฌ์ธ์). ์ด๊ฒ์ 3x3 ํ๋ ฌ์์๋ ๋ถ๊ฐ๋ฅํ์์ ๊ฒ์
๋๋ค.
Homogeneous ์ขํ
๋ฒกํฐ์ w
๊ตฌ์ฑ ์์๋ Homogeneous coordinates ๋ผ๊ณ ๋ ํฉ๋๋ค. Homogeneous ๋ฒกํฐ์์ 3D ๋ฒกํฐ๋ฅผ ์ป๊ธฐ ์ํด x
y
z
์ขํ๋ฅผ w
์ขํ๋ก ๋๋๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ w
๊ตฌ์ฑ์์๊ฐ 1.0
์ด๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฅผ ์์ง ๋ชปํฉ๋๋ค. Homogeneous ์ขํ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช ๊ฐ์ง ์ฅ์ ์ด ์์ต๋๋ค. 3D ๋ฒกํฐ์์ ํ๋ ฌ ๋ณํ์ ์ํํ ์ ์์ต๋๋ค. (w
๊ตฌ์ฑ์์ ์์ด ๋ฒกํฐ๋ฅผ ๋ณํํ ์ ์์). ๋ค์ ์ฅ์์๋ w
๋ฅผ ์ฌ์ฉํ์ฌ 3D ์๊ทผ๊ฐ์ ๊ตฌํ ํ ๊ฒ์
๋๋ค.
๋ํ Homogeneous ์ขํ๊ฐ 0
์ผ๋๋ง๋ค w
์ขํ๊ฐ 0
์ธ ๋ฒกํฐ๋ ๋ณํํ ์ ์๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฒกํฐ๋ ๋ฐฉํฅ ๋ฒกํฐ๋ก ๋ถ๋ฆฝ๋๋ค.
ํํ ์ด๋์ ์ฌ์ฉํ๋ฉด 3์ถ ๋ฐฉํฅ(x
, y
, z
)์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ด๋ํ ์ ์์ผ๋ฏ๋ก ๋ณํ์ ๋งค์ฐ ์ ์ฉํ ๋ณํ ํ๋ ฌ์ด ๋ฉ๋๋ค.
ํ์
๋ง์ง๋ง ๋ช ๊ฐ์ง ๋ณํ์ 2D ๋๋ 3D ๊ณต๊ฐ์์ ์๋์ ์ผ๋ก ์ดํดํ๊ณ ์๊ฐ์ ์ผ๋ก ์ฌ์ ์ง๋ง ํ์ ์ ๊น๋ค๋กญ์ต๋๋ค. ์ด๋ฌํ ํ๋ ฌ์ด ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๋์ง ์ ํํ ์๊ณ ์ถ๋ค๋ฉด Khan Academy์ ์ ํ๋์ ๋์์์ ํ์ ํญ๋ชฉ์ ์์ฒญํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋จผ์ ๋ฒกํฐ์ ํ์ ์ด ์ค์ ๋ก ๋ฌด์์ธ์ง ์ ์ํฉ์๋ค. 2D ๋๋ 3D์ ํ์ ์ ๊ฐ๋๋ก ํ์๋ฉ๋๋ค. ๊ฐ๋๋ ์ ์ ์ฒด๊ฐ 360๋ ๋๋ $2\pi$ ๋ผ๋์์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ์ต์ํ ๊ฐ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ์ ์ ์ค๋ช
ํ๋ ๊ฒ์ ์ํฉ๋๋ค. ๋๋ถ๋ถ์ ํ์ ํจ์์๋ ๋ผ๋์ ๊ฐ๋๊ฐ ํ์ํ์ง๋ง, ๊ฐ๋๋ ๋ผ๋์์ผ๋ก ์ฝ๊ฒ ๋ณํ๋ฉ๋๋ค. ๊ฐ๋ = ๋ผ๋์ ๊ฐ๋ * (180 / PI) ๋ผ๋์ ๊ฐ๋ = ๊ฐ๋ * (PI / 180)
PI
๋ ์ผ๋ฐ์ ์ผ๋ก 3.14159265359
์
๋๋ค. ์์ ๋ฐ์ผ๋ก ํ์ ํ๋ฉด 360/2 = 180 ๋ ํ์ ํ๊ณ ์ค๋ฅธ์ชฝ์ผ๋ก 1/5 ํ์ ํ๋ค๋ ๊ฒ์ ์ค๋ฅธ์ชฝ์ผ๋ก 360/5 = 72 ๋ ํ์ ํ๋ค๋ ์๋ฏธ์
๋๋ค. ์ด๋ ๋ค์์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋๋ ์๊ณ ๋ฐฉํฅ์ผ๋ก 72๋ ํ์ ํ๋ ๊ธฐ๋ณธ 2D๋ฒกํฐ์ ๋ํด ์ค๋ช
๋ฉ๋๋ค.
3D์ ํ์ ์ ๊ฐ๋ ๋ฐ ํ์ ์ถ์ผ๋ก ์ง์ ๋ฉ๋๋ค. ์ง์ ๋ ๊ฐ๋๋ ์ฃผ์ด์ง ํ์ ์ถ์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ํ์ ํฉ๋๋ค. ๋จธ๋ฆฌ๋ฅผ ๋๋ ค ํ๋์ ํ์ ์ถ์ ๋ด๋ ค๋ค ๋ณด๋ฉฐ ์ด๊ฒ์ ์๊ฐํํ์ธ์. ์๋ฅผ ๋ค์ด 3D ์ธ๊ณ์์ 2D๋ฒกํฐ๋ฅผ ํ์ ํ ๋ ํ์ ์ถ์ z์ถ์ผ๋ก ์ค์ ํฉ๋๋ค. (์ด๊ฒ์ ์๊ฐํ ํด ๋ณด์ธ์)
์ผ๊ฐ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ฃผ์ด์ง ๊ฐ๋์์ ๋ฒกํฐ๋ฅผ ์๋ก ํ์ ๋ ๋ฒกํฐ๋ก ๋ณํํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก sine
๊ณผ cosine
ํจ์ (๋ณดํต sin
๊ณผ cos
๋ก ํํํจ)์ ์๋ฆ๋ค์ด ์กฐํฉ์ ํตํด ์ํ๋ฉ๋๋ค. ํ์ ํ๋ ฌ์ด ์์ฑ๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์ค๋ช
์ ์ด ์ฅ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค.
ํ์ ํ๋ ฌ์ ๊ฐ๋๊ฐ ์ธํ ๊ธฐํธ๋ก ํ์๋๋ 3D๊ณต๊ฐ์ ๊ฐ ๋จ์ ์ถ์ ๋ํด ์ ์๋ฉ๋๋ค.
x์ถ์ ์ค์ฌ์ผ๋ก ํ์ :
y์ถ์ ์ค์ฌ์ผ๋ก ํ์ :
z์ถ์ ์ค์ฌ์ผ๋ก ํ์ :
ํ์ ํ๋ ฌ์ ์ฌ์ฉํ์ฌ ์ธ ๊ณ์ ๋จ์ ์ถ ์ค ํ๋๋ฅผ ์ค์ฌ์ผ๋ก ์์น ๋ฒกํฐ๋ฅผ ๋ณํํ ์ ์์ต๋๋ค. ์์์ 3D์ถ์ ์ค์ฌ์ผ๋ก ํ์ ํ๋ ค๋ฉด ๋จผ์ X์ถ, Y์ถ, Z์ถ ์์ผ๋ก ํ์ ํ์ฌ 3๊ฐ๋ฅผ ๋ชจ๋ ๊ฒฐํฉ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ก ์ธํด Gimbal lock ์ด๋ผ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด์ ๋ํด ์์ธํ๊ฒ ์ค๋ช
ํ์ง๋ ์์ง๋ง ๋ ๋์ ํด๊ฒฐ์ฑ
์ ํ์ ํ๋ ฌ์ ๊ฒฐํฉํ๋ ๋์ (0.662, 0.2, 0.722)
(๋จ์ ๋ฒกํฐ)์ ๊ฐ์ ์์์ ๋จ์ ์ถ์ ํ์ ํ๋๋ ๊ฒ์
๋๋ค. ์ด๋ฌํ (๋ณต์กํ..) ํ๋ ฌ์ด ์กด์ฌํ๋ฉฐ ์์์ ํ์ ์ถ์ผ๋ก ($R_x,R_y,R_z)$๋ฅผ ์ฌ์ฉํ์ฌ ์๋์์ ๋ณผ ์ ์์ต๋๋ค.
์ด๋ฌํ ํ๋ ฌ ์์ฑ์ ๋ํ ์ํ์ ๋ ผ์๋ ์ด ์ฅ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค. ์ด ๋งคํธ๋ฆญ์ค์กฐ์ฐจ๋ Gimbal lock์ ์์ ํ ๋ฐฉ์งํ์ง๋ ์์ต๋๋ค. (ํจ์ฌ ์ด๋ ค์ ์ง์ง๋ง) Gimbal lock์ ์ง์ ์ผ๋ก ๋ฐฉ์งํ๋ ค๋ฉด quaternions์ ์ฌ์ฉํ์ฌ ํ์ ์ ๋ํ๋์ผ ํฉ๋๋ค. ์ด๋ ๋ ์์ ํ ๋ฟ๋ง ์๋๋ผ ๊ณ์ฐ๋ ์ต์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฟผํฐ๋์ธ์ ๋ํ ์ค๋ช ์ ์ด ์ฅ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฉ๋๋ค.
Combining matrices
๋ณํ์ ํ๋ ฌ์ ์ฌ์ฉํ๋ ๊ฒ์ ํต์ฌ์ ํ๋ ฌ-ํ๋ ฌ ๊ณฑ์
๋์ ๋จ์ผ ํ๋ ฌ์์ ์ฌ๋ฌ ๋ณํ์ ๊ฒฐํฉ ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ฌ๋ฌ ๋ณํ์ ๊ฒฐํฉํ๋ ๋ณํ ํ๋ ฌ์ ์์ฑํ ์ ์๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฒกํฐ (x, y, z)
๊ฐ ์๊ณ ์ด๋ฅผ 2๋ก ์ค์ผ์ผ๋ง ํ ๋ค์ (1, 2, 3)
์ผ๋ก ๋ณํํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ํ์ํ ๋จ๊ณ์ ๋ํ ๋ณํ ๋ฐ ์ค์ผ์ผ๋ง ํ๋ ฌ์ด ํ์ํฉ๋๋ค. ๊ฒฐ๊ณผ ๋ณํ ํ๋ ฌ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ ฌ์ ๊ณฑํ ๋ ๋จผ์ ๋ณํ์ ์ํ ํ ๋ค์ ์ค์ผ์ผ ๋ณํ์ ์ํํฉ๋๋ค. ํ๋ ฌ ๊ณฑ์ ์ ๊ตํ ๋ฒ์น์ด ์ฑ๋ฆฝํ์ง ์์ผ๋ฏ๋ก ์์๊ฐ ์ค์ํฉ๋๋ค. ํ๋ ฌ์ ๊ณฑํ ๋ ์ค๋ฅธ์ชฝ์ ์๋ ํ๋ ฌ์ด ๋จผ์ ๋ฒกํฐ์ ๊ณฑํด์ง๋ฏ๋ก ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ๊ณฑ์ ์ ์ฝ์ด์ผ ํฉ๋๋ค. ๋จผ์ ์ค์ผ์ผ๋ง ์์ ์ ์ํ ํ ๋ค์ ํ๋ ฌ์ ๊ฒฐํฉ ํ ๋ ํ์ ๋ฐ ๋ง์ง๋ง ๋ณํ์ ์ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ก (๋ถ์ ์ ์ผ๋ก) ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋จผ์ ๋ณํ์ ํ ๋ค์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ฉด ์ด๋ ๋ฒกํฐ๋ ํฌ๊ธฐ๊ฐ ์กฐ์ ๋ฉ๋๋ค!
๋ฒกํฐ์์ ์ต์ข ๋ณํ ํ๋ ฌ์ ์คํํ๋ฉด ๋ค์ ๋ฒกํฐ๊ฐ ์์ฑ๋ฉ๋๋ค.
์ข์ต๋๋ค! ๋ฒกํฐ๋ ๋จผ์ 2๋ก ์ค์ผ์ผ๋ง ํ ๋ค์ (1, 2, 3)
์ผ๋ก ๋ณํ๋ฉ๋๋ค.
์ค์
์ด์ ๋ณํ์ ๋ชจ๋ ์ด๋ก ์ ์ค๋ช ํ์ผ๋ฏ๋ก ์ด ์ง์์ ํ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณผ ์ฐจ๋ก์ ๋๋ค. OpenGL์๋ ํ๋ ฌ ๋๋ ๋ฒกํฐ๊ฐ ๋ด์ฅ๋์ด ์์ง ์์ผ๋ฏ๋ก ์์ฒด ์ํ ํด๋์ค์ ํจ์๋ฅผ ์ ์ํด์ผ ํฉ๋๋ค. ์ด ์ฑ ์์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ์์ ์ํ์ ์ธ๋ถ ์ฌํญ์ ์ถ์ํ ํ๊ณ ๋จ์ํ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉ ํฉ๋๋ค. ์ด ์ข๊ฒ๋ GLM์ด๋ผ๋ OpenGL ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ๋ง์ถคํ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.
GLM
GLM์ OpenGL Mathematics์ ์ฝ์์ด๋ฉฐ ํค๋ ์ ์ฉ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋๋ค. ์ฆ, ํค๋ ํ์ผ๋ง ํฌํจํ๋ฉด ๋ฉ๋๋ค. ๋งํฌ ๋ฐ ์ปดํ์ผ์ด ํ์ํ์ง ์์ต๋๋ค. GLM์ ์น์ฌ์ดํธ์์ ๋ค์ด๋ก๋ ํ ์ ์์ต๋๋ค. ํค๋ ํ์ผ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ๋ฅผ includes ํด๋์ ๋ณต์ฌํ๊ณ ์์ํ๊ฒ ์ต๋๋ค.
ํ์ํ ๋๋ถ๋ถ์ GLM๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ด ํฌํจ ํ 3๊ฐ์ ํค๋ ํ์ผ์์ ์ฐพ์ ์ ์์ต๋๋ค.
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
Let's see if we can put our transformation knowledge to good use by translating a vector of (1,0,0)
by (1,1,0)
(note that we define it as a glm::vec4
with its homogeneous coordinate set to 1.0
:
(1, 0, 0)
์ ๋ฒกํฐ๋ฅผ (1, 1, 0)
์ผ๋ก ๋ณํํ์ฌ ๋ณํ ๊ฐ๋
์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค, (์ฐ๋ฆฌ๋ ํด๋น ๋ฒกํฐ๋ฅผ glm::vec4 ๋ก ์ ์ํ๋ฉฐ, homogeneous ์ขํ๋ฅผ 1.0์ผ๋ก ์ธํ
ํฉ๋๋ค.)
glm::vec4 vec(1.0f, 0.0f, 0.0f, 1.0f);
glm::mat4 trans = glm::mat4(1.0f);
trans = glm::translate(trans, glm::vec3(1.0f, 1.0f, 0.0f));
vec = trans * vec;
std::cout << vec.x << vec.y << vec.z << std::endl;
๋จผ์ GLM์ ๋ด์ฅ ๋ฒกํฐ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ vec
๋ผ๋ ๋ฒกํฐ๋ฅผ ์ ์ํฉ๋๋ค. ๋ค์์ผ๋ก mat4
๋ฅผ ์ ์ํ๊ณ ํ๋ ฌ์ ๋๊ฐ์ ์ 1.0
์ผ๋ก ์ด๊ธฐํํ์ฌ ๋จ์ ํ๋ ฌ๋ก ๋ช
์์ ์ผ๋ก ์ด๊ธฐํ ํฉ๋๋ค. ๋จ์ ํ๋ ฌ๋ก ์ด๊ธฐํ ํ์ง ์์ผ๋ฉด ํ๋ ฌ์ ๋ ํ๋ ฌ (๋ชจ๋ ์์ 0
) ์ด ๋๊ณ ๋ชจ๋ ํ์ ํ๋ ฌ ์ฐ์ฐ๋ ๋ ํ๋ ฌ์ด ๋ฉ๋๋ค.
๋ค์ ๋จ๊ณ๋ ๋ณํ ๋ฒกํฐ์ ํจ๊ป ๋จ์ ํ๋ ฌ์ glm::translate
๋ฅผ ํจ์์ ์ ๋ฌํ์ฌ ๋ณํ ํ๋ ฌ์ ๋ง๋๋ ๊ฒ์
๋๋ค. ( ๊ทธ๋ฐ ๋ค์ ์ฃผ์ด์ง ํ๋ ฌ์ ๋ณํ ํ๋ ฌ์ ๊ณฑํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ก ํ๋ ฌ์ด ๋ณํ๋จ) ๊ทธ๋ฐ ๋ค์ ๋ฒกํฐ์ ๋ณํ ํ๋ ฌ์ ๊ณฑํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ํ๋ ฌ ๋ณํ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๊ธฐ์ตํ๋ค๋ฉด ๊ฒฐ๊ณผ ๋ฒกํฐ๋ (2, 1, 0)
์ธ (1 + 1, 0 + 1, 0 + 0)
์ด์ด์ผ ํฉ๋๋ค. ์ด ์ฝ๋๋ 210
์ ์ถ๋ ฅํ๋ฏ๋ก ๋ณํ ํ๋ ฌ ์์
์ ์ํํ์ต๋๋ค.
๋ ํฅ๋ฏธ๋ก์ด ์์ ์ ์ํํ๋ฌ ์ด์ ์ฅ์ ์ปจํ ์ด๋ ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๊ณ ํ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
glm::mat4 trans = glm::mat4(1.0f);
trans = glm::rotate(trans, glm::radians(90.0f), glm::vec3(0.0, 0.0, 1.0));
trans = glm::scale(trans, glm::vec3(0.5, 0.5, 0.5));
๋จผ์ ๊ฐ ์ถ์์ ์ปจํ
์ด๋์ ํฌ๊ธฐ๋ฅผ 0.5
๋ก ์กฐ์ ํ ๋ค์ ์ปจํ
์ด๋๋ฅผ Z ์ถ ์ค์ฌ์ผ๋ก 90
๋ ํ์ ํฉ๋๋ค. GLM์ ๊ฐ๋๋ฅผ ๋ผ๋์์ผ๋ก ๋ฐ์ผ๋ฏ๋ก glm::radians
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋๋ฅผ ๋ผ๋์์ผ๋ก ๋ณํํฉ๋๋ค. ํ
์ค์ณ๊ฐ ์๋ ์ฌ๊ฐํ์ XY ํ๋ฉด์ ์์ผ๋ฏ๋ก Z์ถ์ ์ค์ฌ์ผ๋ก ํ์ ํฉ๋๋ค. ํ์ ํ๋ ์ถ์ ๋จ์ ๋ฒกํฐ์ด์ฌ์ผ ํ๋ฏ๋ก X,Y ๋๋ Z ์ถ์ ์ค์ฌ์ผ๋ก ํ์ ํ์ง ์๋ ๊ฒฝ์ฐ ๋จผ์ ๋ฒกํฐ๋ฅผ ์ ๊ทํ ํด์ผ ํฉ๋๋ค. ํ๋ ฌ์ GLM์ ๊ฐ ํจ์์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์ GLM์ ์๋์ผ๋ก ํ๋ ฌ์ ํจ๊ป ๋ค์คํํ์ฌ ๋ชจ๋ ๋ณํ์ ๊ฒฐํฉํ๋ ๋ณํ ํ๋ ฌ์ ๋ง๋ญ๋๋ค.
๋ค์์ผ๋ก ์
ฐ์ด๋์ ๋ณํ ํ๋ ฌ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ฐ๋ฆฌ๋ GLSL๋ mat4
์ ํ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์ด์ ์ ์ธ๊ธํ์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ mat4
๊ท ์ผ ๋ณ์๋ฅผ ๋ฐ์๋ค์ด๊ณ ์์น ๋ฒกํฐ์ ํ๋ ฌ uniform
์ ๊ณฑํ๋๋ก ๋ฒํ
์ค ์
ฐ์ด๋๋ฅผ ์กฐ์ ํฉ๋๋ค.
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec2 aTexCoord;
out vec2 TexCoord;
uniform mat4 transform;
void main()
{
gl_Position = transform * vec4(aPos, 1.0f);
TexCoord = vec2(aTexCoord.x, aTexCoord.y);
}
GLSL์๋ ๋ํ ๋ฒกํฐ์ฒ๋ผ ์ค์์ฆ๋ง๊ณผ ๊ฐ์ ์ฐ์ฐ์ ํ์ฉํ๋ mat2
์ mat3
ํ์
์ด ์์ต๋๋ค. ์์ ์ธ๊ธ ํ ๋ชจ๋ ์ํ ์ฐ์ฐ (์์๋ก ์ค์นผ๋ผ-ํ๋ ฌ ๊ณฑํ๊ธฐ, ํ๋ ฌ-๋ฒกํฐ ๊ณฑํ๊ธฐ ๋ฐ ํ๋ ฌ-ํ๋ ฌ ๊ณฑํ๊ธฐ) ํ๋ ฌ ํ์
์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ํน๋ณํ ํ๋ ฌ ์ฐ์ฐ์ด ์ฌ์ฉ๋๋ ๊ณณ ๋ง๋ค ์ด๋ค ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ค๋ช
ํ ๊ฒ์
๋๋ค.
uniform์ ์ถ๊ฐํ๊ณ gl_Position์ ์ ๋ฌํ๊ธฐ ์ํด ์์น ๋ฒกํฐ์ ๋ณํ ํ๋ ฌ์ ๊ณฑํ์ต๋๋ค. ์ด์ ์ปจํ
์ด๋๊ฐ ๋ ๋ฐฐ ์์์ผ ์ผ ํ๋ฉฐ, ์ผ์ชฝ์ผ๋ก 90
๋ ํ์ ํด์ผ ํฉ๋๋ค. ํด๋น ๋ณํ ํ๋ ฌ์ ์
ฐ์ด๋์ ์ ๋ฌํด์ผ ํฉ๋๋ค.
unsigned int transformLoc = glGetUniformLocation(ourShader.ID, "transform");
glUniformMatrix4fv(transformLoc, 1, GL_FALSE, glm::value_ptr(trans));
๋จผ์ uniform ๋ณ์์ ์์น๋ฅผ ๊ฐ์ ธ์จ ๋ค์ Matrix4fv
๋ฅผ ์ ๋ฏธ์ฌ๋ก ์ฌ์ฉํ๋ glUniform
์ ์ฌ์ฉํ์ฌ ํ๋ ฌ ๋ฐ์ดํฐ๋ฅผ ์
ฐ์ด๋๋ก ๋ณด๋
๋๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ ์ฐ๋ฆฌ์๊ฒ ์น์ํ ์ ๋ํผ์ ์์น ์
๋๋ค. ๋๋ฒ์งธ ์ธ์๋ OpenGL์๊ฒ ์ฐ๋ฆฌ๊ฐ ๋ณด๋ผ ํ๋ ฌ์ ์์ธ 1
์
๋๋ค. ์ธ ๋ฒ์งธ ์ธ์๋ ํ๊ณผ ์ด์ ๋ด๊พธ๋ ์ ์น ํ๋ ฌ์ ํ ๊ฒ์ธ์ง์ ๋ํ ์ฌ๋ถ์
๋๋ค. OpenGL ๊ฐ๋ฐ์๋ ๋๋ถ๋ถ GLM์ ๊ธฐ๋ณธ ํ๋ ฌ ๋ ์ด์์์ธ column-major ordering ์ด๋ผ๋ ๋ด๋ถ ๋งคํธ๋ฆญ์ค ๋ ์ด์์์ ์ฌ์ฉํ๋ฏ๋ก ์ ์น ํ๋ ฌ์ ํ ํ์๊ฐ ์์ต๋๋ค. GL_FALSE๋ก ์ค์ ํ๋ฉด ๋ฉ๋๋ค. ๋ง์ง๋ง ์ธ์๋ ์ค์ ํ๋ ฌ ๋ฐ์ดํฐ์ง๋ง GLM์ OpenGL์ด ๊ธฐ๋ํ๋ ํ๋ ฌ ๋ฐ์ดํฐ์ ๋ง์ง ์๋ ๋ฐฉ์์ผ๋ก ์ ์ฅํ๋ฏ๋ก ๋จผ์ GLM์ ๋ด์ฅ ํจ์ value_ptr
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๋ณํํฉ๋๋ค.
์ฐ๋ฆฌ๋ ๋ณํ ํ๋ ฌ์ ๋ฐ๋ค๊ณ ๋ฒํ ์ค ์ ฐ์ด๋์์ uniform์ ์ ์ธํ๊ณ ๋ฒํ ์ค ์ขํ๋ฅผ ๋ณํํ๋ ์ ฐ์ด๋๋ก ํ๋ ฌ์ ๋ณด๋์ต๋๋ค. ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
์๋ฒฝํด! ์ฐ๋ฆฌ์ ์ปจํ ์ด๋๋ ์ค์ ๋ก ์ผ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด์ ธ ์์ต๋๋ค. ์ผ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด์ ธ ์๊ณ ๋ ๋ฐฐ ์์์ง๋ ๋ณํ์ด ์ฑ๊ณต์ ์ผ๋ก ์ ์ฉ๋์์ต๋๋ค. ์ข ๋ ํํคํด์ ธ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ปจํ ์ด๋๋ฅผ ํ์ ํ ์ ์๋์ง ํ์ธํ๊ณ ์ฌ๋ฏธ๋ฅผ ์ํด ์ฐฝ์ ์ค๋ฅธ์ชฝ ํ๋จ์ ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฐฐ์น ํฉ๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ปจํ ์ด๋๋ฅผ ํ์ ํ๋ ค๋ฉด ๊ฐ ํ๋ ์์ ์ ๋ฐ์ดํธ ํด์ผ ํ๋ฏ๋ก ๋ ๋ ๋ฃจํ์์ ๋ณํ ๋งคํธ๋ฆญ์ค๋ฅผ ์ ๋ฐ์ดํธ ํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ GLFW์ ์๊ฐ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐ์ ๋ฐ๋ฅธ ๊ฐ๋๋ฅผ ์ป๊ฒ ์ต๋๋ค.
glm::mat4 trans = glm::mat4(1.0f);
trans = glm::translate(trans, glm::vec3(0.5f, -0.5f, 0.0f));
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
์ด์ ์ฌ๋ก์์๋ ๋ณํ ํ๋ ฌ์ ์ด๋์์๋ ์ ์ธ ํ ์ ์์์ง๋ง ์ด์ ๋ ํ์ ์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ๊ธฐ ์ํด ๋ฐ๋ณต์ ํ ๋๋ง๋ค ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ฆ, ๋ ๋๋ง ๋ฃจํ๋ฅผ ๋ฐ๋ณต ํ ๋๋ง๋ค ๋ณํ ํ๋ ฌ์ ๋ค์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฅ๋ฉด์ ๋ ๋๋ง ํ ๋ ํ๋ ์๋ง๋ค ์ ๊ฐ์ผ๋ก ์์ฑ๋๋ ๋ณํ ํ๋ ฌ๋ ฌ์ด ์์ต๋๋ค.
์ฌ๊ธฐ์ ์์ (0, 0, 0)
์ ์ค์ฌ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ํ์ ํ๊ณ ํ์ ํ๋ฉด ํ์ ๋ ๋ฒ์ ์ ํ๋ฉด์ ์ค๋ฅธ์ชฝ ํ๋จ ๋ชจ์๋ฆฌ๋ก ๋ณํํฉ๋๋ค. ์ฝ๋์์ ๋จผ์ ๋ณํ ํ ๋ค์ ๋์ค์ ํ์ ํ๋๋ผ๋ ์ค์ ๋ณํ์ ๋จผ์ ํ์ ์ ์ ์ฉํ ๋ค์ ๋ณํ์ ์ ์ฉํฉ๋๋ค. ์ด๋ฌํ ๋ชจ๋ ๋ณํ ์กฐํฉ๊ณผ ๊ฐ์ฒด์ ์ ์ฉ๋๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ์กฐ๊ธ ์ด๋ ต์ต๋๋ค. ์ด์ ๊ฐ์ ๋ณํ์ ์๋ํด๋ณด๋ฉด ๊ธ๋ฐฉ ์ดํดํ ์ ์์ต๋๋ค.
์ ๋๋ก ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
์๊ฐ์ ์ง๋จ์ ๋ฐ๋ผ ํ์ ๋๋ ์ปจํ ์ด๋๋ ๋ชจ๋ ๋จ์ผ ๋ณํ ๋งคํธ๋ฆญ์ค๋ก ์ํ๋ฉ๋๋ค! ์ด์ ๊ทธ๋ํฝ ์์ญ์์ ํ๋ ฌ์ด ์ ๊ทธ๋ ๊ฒ ๊ฐ๋ ฅํ ๊ตฌ์กฐ์ธ์ง ์ ์ ์์ต๋๋ค. ๋ฌดํํ ์์ ๋ณํ์ ์ ์ํ๊ณ ์ํ๋ ๋งํผ ์์ฃผ ์ฌ์ฌ์ฉ ํ ์ ์๋ ๋จ์ผ ๋งคํธ๋ฆญ์ค์ ๋ชจ๋ ๊ฒฐํฉ ํ ์ ์์ต๋๋ค. ๋ฒํ ์ค ์ ฐ์ด๋์์ ์ด์ ๊ฐ์ ๋ณํ์ ์ฌ์ฉํ๋ฉด ๋ฒํ ์ค ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์ ์ํ๋ ๋ ธ๋ ฅ์ ์ ์ฝํ๊ณ ์ฒ๋ฆฌ ์๊ฐ๋ ์ ์ฝํ ์ ์์ต๋๋ค. ํญ์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๋ณด๋ผ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. (์ด๋ ๋งค์ฐ ๋๋ฆฝ๋๋ค) ์ฐ๋ฆฌ๊ฐ ํด์ผ ํ ์ผ์ ๋ณํ ์ ๋ํผ์ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ ๋๋ค.
์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ง ๋ชปํ๊ฑฐ๋ ๋ค๋ฅธ ๊ณณ์์ ํด๋งค๊ณ ์๋ค๋ฉด ์์ค์ฝ๋ ์ ์ ๋ฐ์ดํธ๋ ์ ฐ์ด๋๋ฅผ ์ดํด๋ณด์ธ์.
๋ค์ ์ฅ์์๋ ํ๋ ฌ์ ์ฌ์ฉํ์ฌ ๋ฒํ ์ค์ ๋ํด ์๋ก ๋ค๋ฅธ ์ขํ ๊ณต๊ฐ์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช ํฉ๋๋ค. ์ด๊ฒ์ด 3D ๊ทธ๋ํฝ์ค์ ์ฒซ ๊ฑธ์์ด ๋ ๊ฒ ์ ๋๋ค.
๋ ์ฝ์๊ฑฐ๋ฆฌ
- Essence of Linear Algebra: ๋ณํ ๋ฐ ์ ํ ๋์์ ๊ธฐ๋ณธ ์ํ์ ๋ํ Grant Sanderson์ ํ๋ฅญํ ๋น๋์ค ์๋ฆฌ์ฆ
์ฐ์ต
- ์ปจํ ์ด๋์ ๋ง์ง๋ง ๋ณํ์ ์ฌ์ฉํ์ฌ ํ์ ๊ณผ ๋ณํ์ ์์๋ฅผ ๋ณ๊ฒฝ ํด ๋ณด์ธ์. ์ด๋ค ํ์์ด ์ผ์ด๋๋์ง, ๊ทธ๋ฆฌ๊ณ ์ ์ด๋ฐ ํ์์ด ๋ํ๋๋์ง ์ถ๋ก ํ์ธ์. ์ ๋ต.
- glDrawElements์ ๋ํ ๋ ๋ค๋ฅธ ํธ์ถ๋ก ๋ ๋ฒ์งธ ์ปจํ ์ด๋๋ฅผ ๊ทธ๋ ค๋ณด์ญ์์ค. ๊ทธ๋ฌ๋ ๋ณํ๋ง ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์์น์ ๋ฐฐ์นํ์ธ์. ์ด ๋๋ฒ์งธ ๊ฑดํ ์ด๋๊ฐ ์ฐฝ์ ์ผ์ชฝ ์๋จ์ ์๋์ง ํ์ธํ๊ณ ํ์ ํ๋ ๋์ ์๊ฐ์ ๋ฐ๋ผ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํฉ๋๋ค (์ฌ๊ธฐ์ sinํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ฉํฉ๋๋ค. sin์ ์ฌ์ฉํ๋ฉด ์์ ํฌ๊ธฐ๊ฐ ์ ์ฉ๋๋ ์ฆ์ ๊ฐ์ฒด๊ฐ ๋ฐ์ ๋ฉ๋๋ค.) ์ ๋ต.