์ผ๊ฐ๋ฒ์ ๋ฌด์์ ์ฐ์ผ๊น?
์ด๋ค ์ง๊ฐ์ผ๊ฐํ์ด ์์ ๋, ์ฌ๋ฌ๋ถ์ ๋ ๋ณ์ ๊ธธ์ด ๋๋ ํ ๋ณ๊ณผ ํ ์๊ฐ์ ํฌ๊ธฐ๋ง ์๋ฉด ๋ค๋ฅธ ๋ชจ๋ ๊ฒ์ ๊ณ์ฐํ ์ ์๋ค. ๋ค์์ ์ฌ์ค์ ์์๋๊ธฐ ๋ฐ๋๋ค.
์๊ฒ ์ง? ๋ชจ๋ฅด๊ฒ ๋ค๊ณ ? ๋ญ, ๊ฑฑ์ ์ ํด๋ ๋๋ค. ๋ง์ฝ ๋น๋ณ์ด๋ sin, cos, tan ๊ฐ์๊ฑด ํ ๋ฒ๋ ๋ณธ ์ ์ด ์๋ ์ฌ๋์ด๋ผ๋ฉด ์ ์ผ๊ฐํ์ ๋น๊ธ์น ๊ฐ ์์ ์๋๋ก. ์ด๋ป๊ฒ ๋ ๊ฑด์ง๋ ๊ณง ์ ์ ์์ ํ
๋๊น.
์ง๊ฐ์ผ๊ฐํ์์ ๊ฐ์ฅ ๊ธด ๋ณ์ ๋น๋ณ์ด๋ผ๊ณ ํ๋ค. ์ฌ๋ฌ๋ถ์ด ์์์๋ ์๋ฆฌ์์ ๋ฐ๋์ชฝ์ ์๋ ๊ฒ์ด ๋์ด(๋๋ณ)์ด๋ฉฐ ๋๋จธ์ง ํ ๋ณ์ด ๋ฐ๋ณ(๋น๋ณ ๋ง๊ณ ๋ฐ๋ก ์์ ์๋ ๋ณ)์ด๋ค.
...(์ค๋ต)...
๋๋ฆ๋๋ก ๊ธฐ์ตํ๊ธฐ
์ผ๋จ ์ฌ์ธ, ์ฝ์ฌ์ธ, ํ์ ํธ์ ๋ป์ ์์๋ค๋ฉด ์ด์ ์ฑ๊ฐ์ ๋ถ๋ถ์ ์ง๊ฐ์ผ๊ฐํ์ ์ด๋ ๋ณ์ผ๋ก ๋ถ์๋ฅผ ๋ง๋๋์ง ๊ธฐ์ตํ๋ ์ผ ๋ฟ์ด๋ค. ํํ ์ง๊ฐ์ผ๊ฐํ์ ๋๊ณ ์ฌ์ธ, ์ฝ์ฌ์ธ, ํ์ ํธ์ ์๋ฌธ ํ๊ธฐ์ฒด ๋ชจ์์ ๋ฐ๋ผ์ ๊ธฐ์ตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ฌ์ธ์ S๋ฅผ ํ๊ธฐ์ฒด๋ก ์ธ ๋๋ ์ฌ์ ์ผ๋ก ์ฌ๋ผ๊ฐ๋ค ๋ด๋ ค์ค๋ฏ๋ก ๋น๋ณ ๋ถ์ ๋์ด, ์ฝ์ฌ์ธ์ C๋ ์ฌ์ ์ผ๋ก ๋ด๋ ค์๋ค๊ฐ ์์ผ๋ก ๊ฐ๋ฏ๋ก ๋น๋ณ ๋ถ์ ๋์ด๊ฐ ๋๋ค. ์ง์ ์ง๊ฐ์ผ๊ฐํ์ ๊ทธ๋ฆฌ๊ณ ์ผ์ชฝ์ ์๊ฐ์ ์์์ผ๋ก S, C, t๋ฅผ ํ๊ธฐ์ฒด๋ก ์จ๋ณด๋ฉด ์ฝ๊ฒ ์ ์ ์๋ค. ์ ๋ผ?
์ด๋ฐ ๊ฑด ์ด๋จ๊น? ์ฌ๋๋น ์ฝ๋ฐ๋น ํ๋๋น*, ์ด๊ฒ์ ์์ ์์ ์ฐ๋ถ๋ฌํธ๋ ค์ ์์ผ๋ก ๋์ธ ๊ฒ์ด๋ค(๋๋ณ=๋์ด). ์ด ๊ณต์์ ๊ฐ์ง๊ณ ๋๋ฆ๋๋ก ์ฝ๊ธฐ์ ์ธ ์งง์ ๊ธ์ ์ง์ด ๋ณด๋๋ก.
"์ฐฐ๊ฑฐ๋จธ๋ฆฌ ๋ฐ์ฌ, ์ฌ๋ ๋๋๊ณ ๋น์์ผ๋ฉฐ ์ฝ ๋ฐ ๋น๋น์ง ๋ง๊ณ ๋ด ๋ฐ๋ก ๋น*ํค์์ค."
์ฌ๋ฌ๋ถ์ด๋ผ๋ฉด ๋ ๋ฉ์ง ์๋ฅผ ์ง์ ์ ์์๊ฑธ.
*์ฐ๋ถ๋ฌํธ๋ฆฐ ๋ฌธ์ฅ์๋ ๋น(๋น๋ณ)์ด์ง๋ง ์๋๋ ๋ฐ(๋ฐ๋ณ)์ด ๋ง์. ํ๋๋ฐ.
(์ธ์ฉย - ์ฌ๋ฉ์ฌ๋ฉ ์ผ๊ฐ๋ฒ)
๊ฒ์์ ๊ฐ๋จํ๊ฒ ์ ์ฉํ ์ ์๋ ์ผ๊ฐํจ์์ ๊ธฐ๋ณธ์ ์ธ ๋๊ฐ์ง ๋ฌธ์ ๋ฅผ ์์๋ณด๋ ค๊ณ ํ๋ค.
๋จผ์ ํ๋๋ ์์์ ๊ฐ๋ ์ธํ, ์๋ฅผ ๋ค๋ฉด 120๋๋ผ๋ ๊ฐ๋๊ฐ ์ฃผ์ด์ก์ ๋ ๊ฑฐ๊ธฐ์ ๋์ค๋ ๋ฐฉํฅ์ ์ด๋ป๊ฒ ๊ณ์ฐํ๋์ง.
๋๋ฒ์งธ๋ ๊ทธ ๋ฐ๋๋ก ์ด๋ค ๋ฒกํฐ๊ฐ ์ฃผ์ด์ก์ ๋ ๊ทธ ๊ฐ๋๋ฅผ ์ด๋ป๊ฒ ๊ณ์ฐํ๋์ง.
๊ทธ๋ฆฌ๊ณ ํธ๋๋ฒ(Radian)๊ณผ ๊ฐ๋๋ฒ(Degree)๊ฐ์ ๋ณํ, ์ด๊ฑธ ์ ๋ํฐ์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์.
๋ฐ์ง๋ฆ์ด 1์ ๋์ด๊ณ ์ค์ฌ์ ์ด ์์ ์ธ ์์์ ์์ํด๋ณด์.
์ฐ์ (1,0) ์ง์ ์ ๊ฐ๋์ ์์์ ์๋ฏธํ๋ 0ยฐ๋ฅผ ์์์ผ๋ก, ๊ฐ๋๊ฐ ์ฆ๊ฐํ ์๋ก ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ๊ฒ ๋๋ค.
๊ทธ๋ผ ์ด์ ์ด๋ค ์์์ ๋ฐฉํฅ์ ํฅํ๋ ๋ฒกํฐ๊ฐ ์๊ณ , ์๋๊ฒ์ ฮธ(์ธํ)๋ผ๋ ์ด๋ฆ์ 120ยฐ์ง๋ฆฌ ๊ฐ ํ๋๋ฟ์ด๋ผ๊ณ ๊ฐ์ ํด๋ณด์.
์ด ๋ฒกํฐ๊ฐ ์์ ๋ฟ์์๋ ์ง์ ์ ์์ ์์ x, y๋งํผ ์ด๋ํ (x, y)์ง์ ์ด๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ, ์ด ๊ณผ์ ์ ๊ทธ๋ฆฌ๋ฉด ์ง๊ฐ์ผ๊ฐํ์ด ๋์ค๊ฒ ๋๋ค.
๋ฌผ๋ก ์ง๊ด์ ์ผ๋ก ๊ธธ์ด๋ ์์๊ฐ ๋ ์ ์์ผ๋ฏ๋ก ์ฝ๊ฐ ์ด์ํ๊ฒ ๋๊ปด์ง ์ ์์ง๋ง, ๋ถํธ๋ ๋์ค์ ์ ์ฉํ๊ฒ ์ธ ๋๊ฐ ์๋ค.
๋ถํธ๋ ์ขํํ๋ฉด์์ ์์ ์ผ๋ก๋ถํฐ์ ๋ฐฉํฅ์ด๋ผ๊ณ ์๊ฐํ์.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ธ ์ผ๊ฐํจ์ ๊ณต์, ์ฌ์ธ/์ฝ์ฌ์ธ/ํ์ ํธ๋ฅผ ์๊ฐํ๋ค.
๊ณต์์์ ๋ณผ ์ ์๋๋๋ก sin ํจ์์ ฮธ๊ฐ์ ๋ฃ์ ๊ฒฐ๊ณผ๋ y / r, ์ฆ ๋์ด๋ฅผ ๋น๋ณ(๋ฐ์ง๋ฆ)์ผ๋ก ๋๋๋ฉด ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ฝ์ฌ์ธ๊ณผ ํ์ ํธ๋ ๋น์ทํ ๋ฐฉ์.
๋ง์ฝ y๋ฅผ ์๊ณ ์ถ๋ค๋ฉด ์ฌ์ธ๊ณต์์ ํ์ฉํด์ y / r = sin(ฮธ), ์ฌ๊ธฐ์๋ ๋ฐ์ง๋ฆ์ด 1์ด๊ธฐ๋๋ฌธ์ r์ ์๋ตํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก x = cos(ฮธ)๋ผ๊ณ ์ธ ์ ์๊ณ , ๊ตฌํ๋ ค๊ณ ํ๋ ์์์ ๋ฒกํฐ๋ (cos(ฮธ), sin(ฮธ))๋ผ๊ณ ํ ์ ์๋ค.
์์ ฮธ๋ฅผ 120ยฐ๋ผ๊ณ ํ์ผ๋ฏ๋ก ๊ณ์ฐ๊ธฐ์ ์ด๊ฑธ ์ ๋ ฅํ๋ฉด ์ต์ข ์ ์ผ๋ก (-0.5, 0.87)์ด๋ผ๋ ์ขํ๋ฅผ ๊ตฌํ ์ ์๋ค.
๋๋ฒ์งธ ๋ฌธ์ ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ์ฌ์ธ, ์ฝ์ฌ์ธ, ๊ทธ๋ฆฌ๊ณ ํ์ ํธ ํจ์์ ๊ทธ๋ํ๋ฅผ ํ ๋ฒ ํ์ธํ๊ณ ๊ฐ์.
์ด ์ ๋๋ฉ์ด์
์์ ฮธ๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๊ฐ ๊ฐ๋ค์ด ์ด๋ป๊ฒ ๋ณํ๋์ง ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ ๋ณํ๋ ๊ฐ์ ๊ทธ๋ํ๋ก ๊ธฐ๋กํ๋ฉด ฮธ์ ๊ฐ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์์๋๋ก ์์ง์ด๋ ์ฌ์ธ ๊ณก์ ์ ๊ทธ๋ฆด ์ ์๋ค.ย
์ฝ์ฌ์ธ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋กํด๋ณด๋ฉด ์ฌ์ธ ๊ณก์ ๊ณผ ๊ฐ์ ๋ชจ์์ 90ยฐ์ ์คํ์ ๋ง ์ด๋ํ ํํ๋ก ๊ทธ๋ ค์ง๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ฅผ ํตํด์ sin(ฮธ) = cos(90-ฮธ) ์์, ๋ํ cos(ฮธ) = sin(90-ฮธ) ์์ ์ ์ ์๋ค.
์ด์ด์ ํ์ ํธ ๊ทธ๋ํ๋ ํ์ธํด๋ณด์.
ํ์ ํธ ํจ์๋ y/x์ด๋ฏ๋ก ํ๋ ์ ๊ธธ์ด๋ฅผ ์ด๋ก ์ ์ ๊ธธ์ด๋ก ๋๋ ๋น์จ์ด๋ผ๊ณ ํ ์ ์๋ค.
์ฆ ํ์ ํธ ํจ์๋ tan(ฮธ) = sin(ฮธ) / cos(ฮธ) ๋ผ๊ณ ๋ ์ธ ์ ์๋ค.
์ค์ ๋ก ๊ทธ๋ํ๋ฅผ ๊ทธ๋ ค ํ์ธํด๋ณด๋ฉด, 1๊ณผ -1 ์ฌ์ด๋ฅผ ์๋ณตํ๋ ์ฌ์ธ/์ฝ์ฌ์ธ ๊ณก์ ๊ณผ ๋ฌ๋ฆฌ ํ์ ํธ ๊ณก์ ์ ์์ ๋ฌดํ๋ถํฐ ์์ ๋ฌดํ๊น์ง์ ๋ฒ์๋ฅผ ๊ฐ๋๋ค.
์ฐ์ ์ฌ๊ธฐ๋ ๋์ค์ ๋์์ค๊ธฐ๋ก ํ๊ณ , ๋๋ฒ์งธ ๋ฌธ์ ๋ก ๋์ด๊ฐ๋ณด์.
๋๋ฒ์งธ ๋ฌธ์ ๋ ์ด๋ค ๋ฒกํฐ๊ฐ ์ฃผ์ด์ก์ ๋, ๊ทธ ๋ฒกํฐ์ ๊ฐ๋๊ฐ ๋ช ๋์ธ๊ฐ ํ๋ ๊ฒ์ด๋ค.ย
์ด ๋ฌธ์ ์์๋ X๊ฐ -0.71์ด๊ณ , Y๊ฐ 0.71์์ ์๊ณ ์์ผ๋ฏ๋ก, ํ์ ํธ๋ฅผ ์ฌ์ฉํด์ ๊ฐ๋๋ฅผ ๊ตฌํด๋ณด์.ย
tan(ฮธ) = 0.71/-0.71 = -1 ์ด๋ฏ๋ก ํ์ ํธ ๊ทธ๋ํ๋ฅผ ํ์ธํด๋ณด๋ฉด
ํ์ ํธ ๊ฐ์ด -1์ผ ๋, 135ยฐ์ 315ยฐ ๋ ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ด ์กด์ฌํ๋ค.
-1/1๊ณผ 1/-1์ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฐ์ด -1์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ง๊ธ์ ๊ฒฝ์ฐ์๋ ์ ๊ทธ๋ํ์ ๊ทธ๋ ค์ง ๊ฐ๋๋ฅผ ๋์ผ๋ก ํ์ธํ๋ฉด ฮธ๊ฐ 135ยฐ์์ ์ ์ ์๋ค.
๋งค๋ฒ ์ผ์ผํ ๊ทธ๋ํ์ ๊ฐ๋๋ฅผ ๋์ผ๋ก ํ์ธํ๋ ๊ฒ ๋์ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์ญํจ์, asin, acos, atan์ ์์๋ณด์.
๊ฐ๊ฐ ์ํฌ์ฌ์ธ, ์ํฌ์ฝ์ฌ์ธ, ์ํฌํ์ ํธ๋ผ๊ณ ์ฝ๋๋ค.
๋ํ ์ํฌํ์ ํธ ํจ์๋ ์ง์ ์ ์ธ๊ธํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด,
๋๋ค์์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ y/x ๋์ y์ x๋ฅผ ๋ณ๊ฐ์ ์ธ์๋ก ๋ถ๋ฆฌํด์ ๋ฐ๋ atan2 ํจ์๋ฅผ ๋ด์ฅํ๊ณ ์๋ค.
์ด๊ฒ ์ด๋ป๊ฒ ๋์์ด ๋๋์ง ์์๋ณด๊ธฐ ์ํด์, ์์ ์ถ์ ๋ฐ๋ผ 4๊ฐ์ ์ฌ๋ถ๋ฉด์ผ๋ก ๋๋์ด ๋ณด์.
์์ ์์ชฝ ์ฌ๋ถ๋ฉด์์๋ y์ ๊ฐ์ด ์์ผ ๊ฒ์ด๊ณ , ๊ฐ์ ๋ฐฉ์์ผ๋ก x๋ ์ค๋ฅธ์ชฝ์์ ์์ผ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ๋ง์ฝ atan2 ํจ์์ ์ธ์๋ก (0.71, -0.71)์ ์ ๋ฌํ๋ฉด ํจ์์์๋ y๊ฐ ์์๊ณ x๊ฐ ์์์์ ํ์คํ ์ ์ ์๋ค.
์ด๋ ๋ต์ด Q2 ์ฌ๋ถ๋ฉด์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก ํจ์๋ ํ๋์ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ๋ฐํํ ์ ์๊ฒ๋๋ค.
์ฆ ์ด ๋ฌธ์ ์์ ฮธ๋ atan2(y, x)๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ ์ ์๋ค.
์ด์ ํธ๋๋ฒ(๋ผ๋์)์ ์์๋ณด์.
ํธ๋๋ฒ์ ๋ฐ์ง๋ฆ๊ณผ ๊ฐ์ ๊ธธ์ด์ ํธ๋ฅผ ๊ทธ๋ ธ์ ๋ ๋์ํ๋ ๊ฐ์ ํฌ๊ธฐ๋ฅผ 1 rad(๋ผ๋์)์ผ๋ก ์ ์ํ๋ค.
์ค๋ฅธ์ชฝ์ 0 ๋ผ๋์ ์ง์ ๋ถํฐ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ์์ ๋๋ ๋ฅผ ๋ฐ๋ผ์ ์งํํด๋ณด๋ฉด ๋ฐ์์ 3.14, ์ฆ ฯ๋ผ๋์์์ ์ ์ ์๋๋ฐ,
์ด๋ฅผ ํตํด์ ์ฐ์ธก์ 0๋ผ๋์ ์ง์ ๋ถํฐ 90ยฐ์ง์ ๋ง๋ค์ ๋ผ๋์ ๊ฐ์ ๊ฐ๊ฐ 0, ฯ/2, ฯ, 3ฯ/2 ์์ ์ ์ ์๋ค.ย
๋ผ๋์ ๊ฐ์ ๋๊ทธ๋ฆฌ(๊ธฐ์กด์ ๊ฐ๋) ๊ฐ์ผ๋ก ๋ณํํ๋ ค๋ฉด ฯ/180์, ๋ฐ๋๋ก ๋๊ทธ๋ฆฌ ๊ฐ์ ๋ผ๋์์ผ๋ก ๋ณํํ๋ ค๋ฉด 180/ฯ๋ฅผ ๊ณฑํ๋ฉด ๋๋ค.
์ ๋ํฐ์ ์ผ๊ฐํจ์๋ ๋ผ๋์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋์ํ๋๋ฐ, ์ด๋ ๊ณง ์ค์ต์์ ํ์ธํ ์ ์๋ค.
์ค์ต์ ์์ ํ๊ฐ์ง ์ง๊ณ ๋์ด๊ฐ์ผ ํ ์ ์ด ์๋ค.
์ ๋ํฐ์์์ ๊ฐ๋๋ฅผ ๋ณด๋ฉด ํ์ ์ถ Y๋ฅผ ๊ธฐ์ค์ผ๋ก 0ยฐ๋ ์์ Z์ถ ๋ฐฉํฅ์ ํฅํ๊ณ ์๊ณ , ๊ฐ๋๋ฅผ ๋์ฌ ์ค๋ธ์ ํธ๋ฅผ ํ์ ์ํค๋ฉด ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ค.
์ด๊ฒ์ ๊ธฐ์ค์ผ๋ก ์์ ๊ทธ๋ฆฌ๋ฉด 12์ ๋ฐฉํฅ์ 0ยฐ์ ์์์ผ๋ก ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ๊ฒ ๋๋๋ฐ,
์ด๋ ์๊น ๋ฌธ์ ๋ฅผ ํ ๋ ์ฌ์ฉํ๋ ์์ X๋ฐฉํฅ์ด 0ยฐ์ด๊ณ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ ์ผ๊ฐํจ์์ ์๊ณผ ์ฝ๊ฐ ๋ค๋ฅด๋ค.
์ผ๊ฐํจ์์ ์๊ณผ ์ ๋ํฐ ๋ ์ฌ์ด์ ๋ณํ ๋ฐฉ๋ฒ์ ๋จ์ํ๊ฒ 90์์ ๊ฐ๋๋ฅผ ๋นผ ์ฃผ๋ฉด ๋๋ค.ย
๋ง์ฝ ์ ๋ํฐ์์์ 180ยฐ๋ฅผ ๋ณํํ๋ค๋ฉด 90ยฐ-180ยฐ=-90ยฐ, -90ยฐ๋ 270ยฐ์ ๊ฐ์ ๋ง์ด๋ฏ๋ก ๋ณํ์ด ์๋ฃ๋๋ค.
๋ฐ๋ ๋ฐฉํฅ๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก 90ยฐ-270ยฐ=-180ยฐ=180ยฐ ์ด๋ฏ๋ก ์ญ๋ ์ฑ๋ฆฝ.
์ ๋ํฐ๋ฅผ ์ด๊ณ ์ฌ์ ์บ๋ฆญํฐ ์ค๋ธ์ ํธ๋ฅผ ์ถ๊ฐํ์.
๋จ์ํ ์บก์ ์บ๋ฆญํฐ์ ๋ฐฉํฅ์ ์ ์ ์๋๋ก ํ๋ธ๋ฅผ ์์ชฝ์ ์ถ๊ฐํ๋ค.
์ด์ด์ TrigTest๋ผ๋ C#์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํ๊ณ ๋ฐฉ๊ธ ๋ง๋ ์บ๋ฆญํฐ์๊ฒ ๋ฃ์ด์ฃผ์.
public float angleInDegrees;
์ฐ์ ๊ฐ๋๋ฅผ ์ ๋ ฅ๋ฐ์ float ํ๋๋ฅผ ์ ์ธํ์.
์ ๋ฐ์ดํธ ๋ฉ์๋์์๋ ์ด ๊ฐ๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฉํฅ์ ๊ณ์ฐํ ๊ฒ์ด๋ค.ย
Vector3 direction = new Vector3(Mathf.Cos(angleInDegrees * Mathf.PI / 180), 0, Mathf.Sin(angleInDegrees * Mathf.PI / 180));
์ ์ ์ธ๊ธํ๋๋ก ์ ๋ํฐ์ ์ผ๊ฐํจ์๋ ๋ผ๋์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋์ํ๊ธฐ ๋๋ฌธ์, ๋๊ทธ๋ฆฌ ๊ฐ์ผ๋ก ์ ๋ ฅ๋ฐ์ ๊ฐ๋์ ฯ/180์ ๊ณฑํด์ค์ผ ํ๋ค.
๋งค๋ฒ ์ด ๊ฐ์ ๊ณ์ฐํ๋๊ฒ์ ๋ฒ๊ฑฐ๋ก์ฐ๋ฏ๋ก ์ ๋ํฐ์ Mathf ๊ตฌ์กฐ์ฒด์์ ์ ๊ณตํ๋ Deg2Rad ์์๋ฅผ ์ฌ์ฉํ๋ฉด
Vector3 direction = new Vector3(Mathf.Cos(angleInDegrees * Mathf.Deg2Rad), 0, Mathf.Sin(angleInDegrees * Mathf.Deg2Rad));
์ด์ ์ด direction์ด ๋ฌด์จ ์ผ์ ํ๊ณ ์๋์ง ์์๋ณด๊ธฐ ์ํด ์๊ฐํ ํด๋ณด๋๋ก ํ์.
Debug.DrawRay(transform.position, direction * 3, Color.green);
๊ด์ ์ ์์์ ์ ์ค๋ธ์ ํธ์ ์ค์ฌ, ๊ธธ์ด๋ 3, ์๊น์ ์ด๋ก์์ผ๋ก ๊ด์ ์ ๊ทธ๋ ค์ ํ์ธํด๋ณด์.
์์์ ๊ณ์ฐํ direction์ ๋ฐ์ง๋ฆ์ด 1์ด๋ฏ๋ก, ๋ค์ ๋งํ๋ฉด x/r = cos(ฮธ) ์์ r์ด 1๋ก์จ ์๋ต๋ ๊ผด.
๊ฑฐ๊ธฐ์ ์ํ๋ ๊ธธ์ด(์ฌ๊ธฐ์๋ 3)๋ฅผ ๊ณฑํด์ฃผ๋ฉด ๊ทธ ๊ธธ์ด๋ก ๊ด์ ์ด ๊ทธ๋ ค์ง๊ฒ ๋๋ค.
๋ฌผ๋ก ์ฌ๊ธฐ์ 3 ๋์ ์๋ก์ด float ๋ณ์๋ฅผ ์ ์ธํด์ ์ฌ์ฉํ๋๊ฒ๋ ์ข์ ์๊ฐ.
์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ ์คํ์์ผ๋ณด๋ฉด ์บ๋ฆญํฐ์์ ๊ด์ ์ด ๋์ค๊ณ , angleInDegree ๋ณ์์ ๊ฐ์ ์ฆ๊ฐ์ํค๋ฉด 3์๋ฐฉํฅ(์ค๋ฅธ์ชฝ)๋ถํฐ ๋ฐ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ ๊ด์ ์ ๋ณผ ์ ์๋ค.
Vector3 direction = new Vector3(Mathf.Cos((90 - angleInDegrees) * Mathf.Deg2Rad), 0, Mathf.Sin((90 - angleInDegrees) * Mathf.Deg2Rad));
๊ทธ๋ฌ๋ ์ ์ ์ธ๊ธํ๋๋ก ์ ๋ํฐ๋ 12์ ๋ฐฉํฅ๋ถํฐ ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ ํํ๋ก ๋์ด์๋ค.
์ด๋ 90 - ฮธ ๋ณํ์ ํตํด ์์ ํ ์ ์์ผ๋ฏ๋ก, ์ฝ๋์ angleInDegrees ๋ถ๋ถ์ ๊ณ ์ณ๋ณด์.
์คํ์์ผ๋ณด๋ฉด 12์ ๋ฐฉํฅ๋ถํฐ ์๊ณ๋ฐฉํฅ์ผ๋ก ํ์ ํ๊ฒ๋ ๋ฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์์ ์ ์ด ๊ณต์์ ๊ธฐ์ตํ๋ค๋ฉด ์ฝ๋๋ฅผ ์กฐ๊ธ ๋ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์๋ค.
๋ฐฉ๊ธ ์์ฑํ ์ฝ๋์์ angleInDegrees ๋ถ๋ถ์ด ๋ฑ ์ด ํํ์ด๋ฏ๋ก
Vector3 direction = new Vector3(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), 0, Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
์ด๋ ๊ฒ x์ sin์, y์ cos์ ์ฌ์ฉํด๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์๋ค.
์ฒซ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ผ๋ ๋ฐฉํฅ์์ ๊ฐ๋๋ฅผ ๊ตฌํ๋ ๋๋ฒ์งธ ๋ฌธ์ ๋ก ๋์ด๊ฐ๋ณด์.
์ฌ๊ธฐ์๋ ํค๋ณด๋ ์ ๋ ฅ์ ๋ฐฉํฅ์ผ๋ก ๋ฐ๊ณ ๊ทธ๊ฒ์ ๊ธฐ์ค์ผ๋ก ๊ฐ๋๋ฅผ ๊ตฌํด ์บ๋ฆญํฐ๋ฅผ ํ์ ์ํค๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํด๋ณด๋ ค๊ณ ํ๋ค.
Vector3 inputDir = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized;
transform.Translate(inputDir * Time.deltaTime * 5, Space.World);
๋ฐฉํฅํค ์ ๋ ฅ์ ๋ฐ์์ ๊ทธ ๋ฐฉํฅ๋๋ก ์ค๋ธ์ ํธ๋ฅผ ์ด๋์ํค๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
์ฌ๊ธฐ์์ 5๋ ์ด๋์๋๊ฐ ๋๋ฏ๋ก ์ฌ๊ธฐ์ ๋ํ ์๋ก์ด float ๋ฅผ ์ ์ธํด์ ์ฌ์ฉํ ์ ์๋ค.
์คํ ํ ์กฐ์ํด๋ณด๋ฉด ์บ๋ฆญํฐ ์์ง์์ ๋ฐ๋ผ ๊ด์ ์ ๋ชจ์์ด ์ด์ํ๊ฒ ๋นํ๋ฆดํ ๋ฐ, ๊ด์ ์ ๋์ ์ธ direction ๋ฒกํฐ๋ ์์ ์ ๊ธฐ์ค์ผ๋ก ๊ณ์ฐ๋ ์ง์ ์ด๊ธฐ ๋๋ฌธ.
๊ฑฐ์ฌ๋ฆฐ๋ค๋ฉด ์์ Debug.DrawRay ๊ตฌ๋ฌธ์ ์ฃผ์์ฒ๋ฆฌ ํ๊ฑฐ๋ direction * 3์ transform.position์ ๋ํ๋ฉด ๋๋ค.
์๋ฌดํผ ์บ๋ฆญํฐ๋ ๋ฐฉํฅํค๋ฅผ ์ ๋ ฅํ๋๋๋ก ์์ง์ด์ง๋ง, ํ์ ํ์ง๋ ์๋๋ค.
float inputAngle = Mathf.Atan2(inputDir.z, inputDir.x) * Mathf.Rad2Deg;
๋ฐฉํฅ์ผ๋ก๋ถํฐ ๊ฐ๋๋ฅผ ๊ตฌํ๊ธฐ ์ํด Atan2 ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
Atan2 ํจ์์ ๋ง์ฐ์ค๋ฅผ ์ ์ ์ฌ๋ ค๋ณด๋ฉด "Returns the angle in radians" ๋ผ๊ณ ๋์ค๋๋ฐ, ์ด๋ Atan2์ ๋ฐํ๊ฐ์ด ๋ผ๋์์์ ์๋ฏธํ๋ค.
์ฌ๊ธฐ์๋ ์ค์ ์ค๋ธ์ ํธ๋ฅผ ์ผ์ ๊ฐ๋(๋๊ทธ๋ฆฌ)๋งํผ ํ์ ์์ผ์ผ ํ๊ธฐ ๋๋ฌธ์ Rad2Deg๋ฅผ ๊ณฑํด์ ๋ผ๋์๊ฐ์ ๊ฐ๋๋ก ๋ฐ๊ฟ์ฃผ์.
transform.eulerAngles = Vector3.up * inputAngle;
๊ทธ๋ฆฌ๊ณ ๊ณ์ฐ๋ ๊ฐ์ ์ค๋ธ์ ํธ์ ์ค์ ๊ฐ๋๋ก ํ ๋นํด์ ํ์ ์ํจ๋ค.
์ค๋ธ์ ํธ๊ฐ Y์ถ์ ์ถ์ผ๋ก ํ์ ํด์ผํ๊ธฐ ๋๋ฌธ์ Vector3.up, ์ฆ (0, 1, 0)์ ๊ณฑํ๋ฉด Y์ถ์ ๊ธฐ์ค์ผ๋ก ํ์ ํ๊ฒ ๋๋ค.
์คํฌ๋ฆฝํธ๋ฅผ ์ ์ฅํ๊ณ ์ฌ์ ์คํ์์ผ ๋ณด๋ฉด
์บ๋ฆญํฐ๊ฐ ํ์ ํ๊ธฐ๋ ํ๋๋ฐ ์ข ์ด์ํ๊ฒ ํ์ ํ๋ค.
์ด๊ฒ์ ์๊น ๊ด์ ์ ๊ทธ๋ฆด ๋ ์ค๋ช ํ๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ผ๊ฐํจ์์ ์ ๋ํฐ์ ๊ฐ๋ ํ์ ๋ฐฉํฅ์ด ๋ฌ๋ผ์ ๋ฐ์ํ๋ ํ์์ด๋ค.
float inputAngle = 90 - (Mathf.Atan2(inputDir.z, inputDir.x) * Mathf.Rad2Deg);
๊ณ์ฐํ๋ ๊ฐ๋ ๊ฐ์ 90์์ ๋นผ๋๋ก ์ฝ๋๋ฅผ ์์ ํ ํ ํ ์คํธํด๋ณด์.
์ด๋ฒ์ ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์บ๋ฆญํฐ๊ฐ ํ์ ํ๋๊ฒ์ ํ์ธํ ์ ์์ ๊ฒ์ด๋ค.
์ถ๊ฐ๋ก, ์์ direction์์ 90์์ sin์ ๋นผ๋ ๋์ cos์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ฌ๊ธฐ์๋ ์ฌ์ฉํ ์ ์๋ค.
float inputAngle = Mathf.Atan2(inputDir.x, inputDir.z) * Mathf.Rad2Deg;
90์์ ๊ฐ๋๋ฅผ ๋นผ๋ ๋์ Atan2์ ๋๊ธฐ๋ ์ธ์์ ์์๋ง ๋ฐ๊ฟ์ค๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
๋ง์ง๋ง์ผ๋ก ํค๋ณด๋๋ฅผ ๋ผ๋ ์๊ฐ ์บ๋ฆญํฐ์ ๊ฐ๋๊ฐ 0์ผ๋ก ์ด๊ธฐํ๋๋ ํ์์ด ๋ง์์ ๋ค์ง ์์์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค.
์ด๋ ๋ฐฉํฅํค๋ฅผ ๋๋ฅด์ง ์์ ๋๋ ์ ๋ฐ์ดํธ์์ ์ง์์ ์ผ๋ก Atan2๋ฅผ ํธ์ถํ์ฌ 0์ ํ ๋นํ๊ธฐ ๋๋ฌธ.
float inputMagnitude = inputDir.sqrMagnitude;
//...
if (inputMagnitude != 0)
{
ย ย float inputAngle = Mathf.Atan2(inputDir.x, inputDir.z) * Mathf.Rad2Deg;
ย ย transform.eulerAngles = Vector3.up * inputAngle;
}
inputDir ์ ์ธ ๋ฐ์ ์๋ก์ด float ๋ณ์๋ฅผ ์ถ๊ฐํด์ฃผ์. ๊ทธ๋ฆฌ๊ณ ํด๋น ๋ณ์๊ฐ 0์ด ์๋๋๋ง, ์ฆ ์ด๋ ๋ฐฉํฅํค๋ผ๋ ๋๋ฅด๊ณ ์๋ ๊ฒฝ์ฐ์๋ง ๊ฐ๋๋ฅผ ๋ณ๊ฒฝํ๊ฒ๋ ํด์ฃผ๋ฉด ํด๊ฒฐ๋๋ค.
์๋๋ ์ฝ๋ ์ ๋ฌธ.
public class TrigTest : MonoBehaviour
{
ย ย public float angleInDegrees;
ย ย public float rayLength;
ย ย public float moveSpeed;
ย ย void Update()
ย ย {
ย ย ย ย //Calculate direction
ย ย ย ย Vector3 direction = new(Mathf.Sin(angleInDegrees * Mathf.Deg2Rad), 0, Mathf.Cos(angleInDegrees * Mathf.Deg2Rad));
ย ย ย ย Debug.DrawLine(transform.position, transform.position + (direction * rayLength), Color.green);
ย ย ย ย //Calculate angle and Move
ย ย ย ย Vector3 inputDir = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized;
ย ย ย ย float inputMagnitude = inputDir.sqrMagnitude;
ย ย ย ย transform.Translate(moveSpeed * Time.deltaTime * inputDir, Space.World);
ย ย ย ย if (inputMagnitude != 0)
ย ย ย ย {
ย ย ย ย ย ย float inputAngle = Mathf.Atan2(inputDir.x, inputDir.z) * Mathf.Rad2Deg;
ย ย ย ย ย ย transform.eulerAngles = Vector3.up * inputAngle;
ย ย ย ย }
ย ย }
}
ํด๋น ๋๊ธ์ ์ญ์ ๋์์ต๋๋ค.
์ด ๊ธ์ ์ผ๊ฐํจ์ ์ด๋์ ๋ ์๊ณ ์๋ ์ฌ๋์ด ๋ณด๋ฉด ์ข์ ๊ธ์ด์ง. ์ ๋๋ก ๋ ธ๋ฒ ๊ฐ ๋ณผ ๋งํ ๊ธ์ ์๋
์ด๊ฒ ์ ์์ง๊น์ง ๊ฐ๋ ๊ธ์ ์๊ฐ์์? ์กฐํ์๋ 100์ด ๋๋๊ฑฐ๋ณด๋ฉด ๊ฐค์ ๊ฐ๋ฐ ์ง์ง๋ก ํ๋ ์ธ๊ฐ์ด ์ผ๋ง๋ ์ ์์ง ์ ์ ์๋ค