WebXR์ ๊ณต๊ฐ ์ขํ๊ณ์ ๋ํ ์ฌ์ธต ๋ถ์. ์ฐธ์กฐ ๊ณต๊ฐ, ์ขํ ๋ณํ ๋ฐ ๋ชฐ์ ๊ฐ ์๊ณ ์ ํํ XR ๊ฒฝํ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ๊ตฌํฉ๋๋ค.
WebXR ๊ณต๊ฐ ์ขํ ์์ง: ์ขํ๊ณ ๊ด๋ฆฌ ๋ง์คํฐํ๊ธฐ
WebXR์ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ๋ชฐ์ ๊ฐ ์๊ณ ์ํธ์์ฉ์ ์ธ ์ฆ๊ฐ ๋ฐ ๊ฐ์ ํ์ค ๊ฒฝํ์ ๊ตฌ์ถํ ์ ์๋ ๋๋ผ์ด ์ ์ฌ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ๊ฒฌ๊ณ ํ๊ณ ์ ํํ XR ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ๋ฐ ์์ด ๊ทผ๋ณธ์ ์ธ ์ธก๋ฉด์ ๊ณต๊ฐ ์ขํ ์์ง์ ์ดํดํ๊ณ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ WebXR์ ์ขํ๊ณ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ฐธ์กฐ ๊ณต๊ฐ, ์ขํ ๋ณํ, ๊ทธ๋ฆฌ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๋งค๋ ฅ์ ์ธ XR ๊ฒฝํ์ ๋ง๋ค๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
WebXR ์ขํ๊ณ ์ดํดํ๊ธฐ
WebXR์ ํต์ฌ์ 3์ฐจ์ ๋ฐ์นด๋ฅดํธ ์ขํ๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค. ์ด ์์คํ ์ ์ธ ๊ฐ์ ์ถ(X, Y, Z)์ ์ฌ์ฉํ์ฌ ๊ณต๊ฐ ๋ด ๊ฐ์ฒด์ ์์น์ ๋ฐฉํฅ์ ์ ์ํฉ๋๋ค. ์ด ์ถ๋ค์ด ์ด๋ป๊ฒ ์ ์๋๊ณ WebXR์ด ์ด๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง ์ดํดํ๋ ๊ฒ์ ์ ํํ๊ณ ์ง๊ด์ ์ธ XR ๊ฒฝํ์ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
- X์ถ: ์ผ๋ฐ์ ์ผ๋ก ์ํ ์ถ์ ๋ํ๋ด๋ฉฐ, ์์ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ฅ๋ฉ๋๋ค.
- Y์ถ: ๋ณดํต ์์ง ์ถ์ ๋ํ๋ด๋ฉฐ, ์์ ๊ฐ์ ์์ชฝ์ผ๋ก ํ์ฅ๋ฉ๋๋ค.
- Z์ถ: ๊น์ด ์ถ์ ๋ํ๋ด๋ฉฐ, ์์ ๊ฐ์ ๋ทฐ์ด๋ฅผ ํฅํด ํ์ฅ๋ฉ๋๋ค. ์ผ๋ถ ๊ท์น(์: OpenGL)์์๋ Z์ถ์ด ๋ทฐ์ด๋ก๋ถํฐ *๋ฉ์ด์ง๋* ๋ฐฉํฅ์ผ๋ก ํ์ฅ๋์ง๋ง, WebXR์ ๋ณดํต ๊ทธ ๋ฐ๋ ๊ท์น์ ์ฌ์ฉํฉ๋๋ค.
์์ (0, 0, 0)์ ์ธ ์ถ์ด ๋ชจ๋ ๊ต์ฐจํ๋ ์ง์ ์ ๋๋ค. XR ์ฌ ๋ด์ ๋ชจ๋ ์์น์ ๋ฐฉํฅ์ ์ด ์์ ์ ๊ธฐ์ค์ผ๋ก ์ ์๋ฉ๋๋ค.
์ขํ๊ณ์ ์์ก์ด ๊ท์น(Handedness)
WebXR์ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅธ์ ์ขํ๊ณ(right-handed coordinate system)๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ค๋ฅธ์ ์ขํ๊ณ์์๋ ์ค๋ฅธ์์ ์๊ฐ๋ฝ์ ์์ X์ถ์์ ์์ Y์ถ์ผ๋ก ๊ฐ์ธ ์ฅ์์ ๋, ์์ง์๊ฐ๋ฝ์ด ์์ Z์ถ ๋ฐฉํฅ์ ๊ฐ๋ฆฌํต๋๋ค. ์ด ๊ท์น์ ๊ณ์ฐ๊ณผ ๋ณํ์ ์ํํ ๋ ๊ธฐ์ตํด์ผ ํ ์ค์ํ ์ฌํญ์ ๋๋ค.
์ฐธ์กฐ ๊ณต๊ฐ: ๊ณต๊ฐ ์ดํด์ ๊ธฐ์ด
์ฐธ์กฐ ๊ณต๊ฐ(Reference space)์ WebXR์์ ๊ณต๊ฐ์ ์ดํดํ๋ ๊ธฐ๋ฐ์ ๋๋ค. ์ด๋ XR ์ฌ ๋ด ๊ฐ์ฒด๋ค์ ์์น์ ๋ฐฉํฅ์ ํด์ํ๊ธฐ ์ํ ๋งฅ๋ฝ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ ์ฐธ์กฐ ๊ณต๊ฐ์ ์์ฒด ์ขํ๊ณ๋ฅผ ์ ์ํ๋ฉฐ, ๊ฐ๋ฐ์๋ ์ด๋ฅผ ํตํด ๊ฐ์ ์ฝํ ์ธ ๋ฅผ ๋ค์ํ ๊ธฐ์ค์ ์ ๊ณ ์ ํ ์ ์์ต๋๋ค.
WebXR์ ๊ฐ๊ฐ ํน์ ๋ชฉ์ ์ ๊ฐ์ง ์ฌ๋ฌ ์ ํ์ ์ฐธ์กฐ ๊ณต๊ฐ์ ์ ์ํฉ๋๋ค:
- ๋ทฐ์ด ์ฐธ์กฐ ๊ณต๊ฐ(Viewer Reference Space): ์ด ์ฐธ์กฐ ๊ณต๊ฐ์ ๋ทฐ์ด์ ๋จธ๋ฆฌ์ ๋ถ์ฐฉ๋ฉ๋๋ค. ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์์ ๋ ๋ ์ฌ์ด์ ์์นํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋จธ๋ฆฌ๋ฅผ ์์ง์ด๋ฉด ๋ทฐ์ด ์ฐธ์กฐ ๊ณต๊ฐ๋ ํจ๊ป ์์ง์ ๋๋ค. ์ด๋ ํค๋์ ๋์คํ๋ ์ด(HUD)์ ๊ฐ์ ๋จธ๋ฆฌ์ ๊ณ ์ ๋ ์ฝํ ์ธ ๋ฅผ ๋ง๋๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- ๋ก์ปฌ ์ฐธ์กฐ ๊ณต๊ฐ(Local Reference Space): ๋ก์ปฌ ์ฐธ์กฐ ๊ณต๊ฐ์ ์ฌ์ฉ์์ ์์ ์์น์ ๊ณ ์ ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ์ฃผ์๋ฅผ ์์ง์ฌ๋ ์ค์ ํ๊ฒฝ์ ๋ํด ๊ณ ์ ๋ ์ํ๋ฅผ ์ ์งํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์์ ๋ฌผ๋ฆฌ์ ๊ณต๊ฐ ๋ด ํน์ ์์น์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ณ ์ ํด์ผ ํ๋ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ์ด์์ ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ค์ ํ ์ด๋ธ ์์ ๊ฐ์ ํ๋ถ์ ๋๋ ๊ฒฝ์ฐ๋ฅผ ์์ํด ๋ณด์ธ์. ๋ก์ปฌ ์ฐธ์กฐ ๊ณต๊ฐ์ ํ๋ถ์ ๊ทธ ์์น์ ์ ์ง์์ผ ์ค๋๋ค.
- ๊ฒฝ๊ณ ์ฐธ์กฐ ๊ณต๊ฐ(Bounded Reference Space): ๋ก์ปฌ ์ฐธ์กฐ ๊ณต๊ฐ๊ณผ ์ ์ฌํ์ง๋ง, XR ๊ฒฝํ์ด ์๋ํ๋๋ก ์ค๊ณ๋ ๊ฒฝ๊ณ๋ ๋ณผ๋ฅจ์ ์ ์ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์์ ํ๊ณ ํต์ ๋ ์์ญ ๋ด์ ๋จธ๋ฌผ๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ ํนํ ๋ฃธ์ค์ผ์ผ VR ๊ฒฝํ์์ ์ค์ํฉ๋๋ค.
- ๋ฌด๊ฒฝ๊ณ ์ฐธ์กฐ ๊ณต๊ฐ(Unbounded Reference Space): ์ด ์ฐธ์กฐ ๊ณต๊ฐ์๋ ๋ฏธ๋ฆฌ ์ ์๋ ๊ฒฝ๊ณ๊ฐ ์์ต๋๋ค. ์ฌ์ฉ์๋ ์ ์ฌ์ ์ผ๋ก ๋ฌดํํ ๊ฐ์ ํ๊ฒฝ ๋ด์์ ์์ ๋กญ๊ฒ ์์ง์ผ ์ ์์ต๋๋ค. ์ด๋ ๋นํ ์๋ฎฌ๋ ์ดํฐ๋ ๊ด๋ํ ๊ฐ์ ํ๊ฒฝ์ ํํํ๋ VR ๊ฒฝํ์์ ํํ ์ฌ์ฉ๋ฉ๋๋ค.
- ์ถ์ ์ฐธ์กฐ ๊ณต๊ฐ(Tracking Reference Space): ์ด๊ฒ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ณต๊ฐ์ ๋๋ค. ํ๋์จ์ด์ ์ถ์ ๋ ํฌ์ฆ๋ฅผ ์ง์ ๋ฐ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ง์ ์ํธ์์ฉํ์ง๋ ์์ง๋ง, ๋ค๋ฅธ ์ฐธ์กฐ ๊ณต๊ฐ๋ค์ด ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ๋ฉ๋๋ค.
์ฌ๋ฐ๋ฅธ ์ฐธ์กฐ ๊ณต๊ฐ ์ ํํ๊ธฐ
์ ์ ํ ์ฐธ์กฐ ๊ณต๊ฐ์ ์ ํํ๋ ๊ฒ์ ์ํ๋ XR ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ฒฐ์ ์ ๋ด๋ฆด ๋ ๋ค์ ์์๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ์ด๋์ฑ: ์ฌ์ฉ์๊ฐ ํ์ค ์ธ๊ณ์์ ์์ง์ผ ๊ฒ์ธ๊ฐ์? ๊ทธ๋ ๋ค๋ฉด ๋ทฐ์ด ์ฐธ์กฐ ๊ณต๊ฐ๋ณด๋ค ๋ก์ปฌ ๋๋ ๊ฒฝ๊ณ ์ฐธ์กฐ ๊ณต๊ฐ์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค.
- ๊ณ ์ (Anchoring): ๊ฐ์ ๊ฐ์ฒด๋ฅผ ํ์ค ์ธ๊ณ์ ํน์ ์์น์ ๊ณ ์ ํด์ผ ํ๋์? ๊ทธ๋ ๋ค๋ฉด ๋ก์ปฌ ์ฐธ์กฐ ๊ณต๊ฐ์ด ์ต์ ์ ์ ํ์ ๋๋ค.
- ๊ท๋ชจ(Scale): XR ๊ฒฝํ์ ๊ท๋ชจ๋ ์ด๋ ์ ๋์ธ๊ฐ์? ๊ฒฝํ์ด ํน์ ๋ฌผ๋ฆฌ์ ๊ณต๊ฐ์ ์ํด ์ค๊ณ๋ ๊ฒฝ์ฐ ๊ฒฝ๊ณ ์ฐธ์กฐ ๊ณต๊ฐ์ด ์ค์ํฉ๋๋ค.
- ์ฌ์ฉ์ ํธ์์ฑ: ์ ํํ ์ฐธ์กฐ ๊ณต๊ฐ์ด ์ฌ์ฉ์์ ์์ ์์ง์ ๋ฐ ์ํธ์์ฉ๊ณผ ์ผ์นํ๋์ง ํ์ธํ์ธ์. ์์ ํ๋ ์ด์คํ์ด์ค์ ๋ฌด๊ฒฝ๊ณ ๊ณต๊ฐ์ ์ฌ์ฉํ๋ฉด ๋ถํธํจ์ ์ด๋ํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ๊ฑฐ์ค์ ๊ฐ์ ๊ฐ๊ตฌ๋ฅผ ๋ฐฐ์นํ ์ ์๋ AR ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ๋ก์ปฌ ์ฐธ์กฐ ๊ณต๊ฐ์ ์ฌ์ฉ์๊ฐ ๋ฐฉ ์์ ๋์๋ค๋๋ ๋์ ๊ฐ์ ๊ฐ๊ตฌ๊ฐ ์๋ ์์น์ ๊ณ ์ ๋์ด ์๋๋ก ํด์ฃผ๋ฏ๋ก ์๋ฒฝํ ์ ํ์ด ๋ ๊ฒ์ ๋๋ค.
์ขํ ๋ณํ: ๊ณต๊ฐ ๊ฐ์ ๊ฐ๊ทน ๋ฉ์ฐ๊ธฐ
์ขํ ๋ณํ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ ๊ณต๊ฐ ๊ฐ์ ์์น์ ๋ฐฉํฅ์ ๋ณํํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฌ์ฉ์์ ์์ง์์ด๋ ์ ํ๋ ์ฐธ์กฐ ๊ณต๊ฐ์ ๊ด๊ณ์์ด XR ์ฌ ๋ด์์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐฐ์นํ๊ณ ๋ฐฉํฅ์ ์ค์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ง์น ๋ค๋ฅธ ์ธ์ด ๊ฐ์ ๋ฒ์ญ๊ณผ ๊ฐ์ต๋๋ค. ์ขํ ๋ณํ์ ํตํด WebXR์ ๊ฐ์ฒด๊ฐ ์ด๋ค "์ธ์ด"(์ฐธ์กฐ ๊ณต๊ฐ)๋ก ์ค๋ช ๋๋ ๊ทธ ์์น๋ฅผ ์ดํดํ ์ ์์ต๋๋ค.
WebXR์ ์ขํ ๋ณํ์ ๋ํ๋ด๊ธฐ ์ํด ๋ณํ ํ๋ ฌ(transformation matrix)์ ์ฌ์ฉํฉ๋๋ค. ๋ณํ ํ๋ ฌ์ ํ ์ขํ๊ณ์ ์ ์ ๋ค๋ฅธ ์ขํ๊ณ๋ก ๋ณํํ๋ ๋ฐ ํ์ํ ์ด๋, ํ์ , ํฌ๊ธฐ ์กฐ์ ์ ์ธ์ฝ๋ฉํ๋ 4x4 ํ๋ ฌ์ ๋๋ค.
๋ณํ ํ๋ ฌ ์ดํดํ๊ธฐ
๋ณํ ํ๋ ฌ์ ์ฌ๋ฌ ์ฐ์ฐ์ ๋จ์ผ ํ๋ ฌ๋ก ๊ฒฐํฉํฉ๋๋ค:
- ์ด๋(Translation): X, Y, Z ์ถ์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ ์์ง์ ๋๋ค.
- ํ์ (Rotation): X, Y, Z ์ถ์ ์ค์ฌ์ผ๋ก ๊ฐ์ฒด๋ฅผ ํ์ ์ํต๋๋ค. ์ด๋ ๋ด๋ถ์ ์ผ๋ก ์ฟผํฐ๋์ธ(quaternion)์ผ๋ก ํํ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ง, ๊ถ๊ทน์ ์ผ๋ก ์ ์ฒด ๋ณํ ๋ด์์ ํ์ ํ๋ ฌ ๊ตฌ์ฑ ์์๋ก ํด์๋ฉ๋๋ค.
- ํฌ๊ธฐ ์กฐ์ (Scale): X, Y, Z ์ถ์ ๋ฐ๋ผ ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค.
์ ์ ์ขํ(4D ๋ฒกํฐ๋ก ํํ)์ ๋ณํ ํ๋ ฌ์ ๊ณฑํ๋ฉด ์๋ก์ด ์ขํ๊ณ์์์ ๋ณํ๋ ์ขํ๋ฅผ ์ป์ ์ ์์ต๋๋ค. ๋ง์ WebXR API๊ฐ ํ๋ ฌ ๊ณฑ์ ์ ๋์ ์ฒ๋ฆฌํด์ฃผ์ง๋ง, ๊ณ ๊ธ ์๋๋ฆฌ์ค์์๋ ๊ธฐ๋ณธ ์ํ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
WebXR์์ ๋ณํ ์ ์ฉํ๊ธฐ
WebXR์ ๋ณํ์ ์ป๊ณ ์ ์ฉํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค:
XRFrame.getViewerPose()
: ์ฃผ์ด์ง ์ฐธ์กฐ ๊ณต๊ฐ์์ ๋ทฐ์ด์ ํฌ์ฆ(์์น์ ๋ฐฉํฅ)๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ฅผ ํตํด ํน์ ๊ธฐ์ค์ ์ ๋ํ ๋ทฐ์ด์ ์์น๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค.XRFrame.getPose()
: ์ฃผ์ด์ง ์ฐธ์กฐ ๊ณต๊ฐ์์XRInputSource
(์: ์ปจํธ๋กค๋ฌ) ๋๋XRAnchor
์ ํฌ์ฆ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ์ปจํธ๋กค๋ฌ ๋ฐ ๊ธฐํ ์ถ์ ๋ ๊ฐ์ฒด์ ์์น์ ๋ฐฉํฅ์ ์ถ์ ํ๋ ๋ฐ ํ์์ ์ ๋๋ค.- ํ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ: gl-matrix(https://glmatrix.net/)์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ณํ ํ๋ ฌ์ ์์ฑ, ์กฐ์ ๋ฐ ์ ์ฉํ๋ ํจ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ณต์กํ ๋ณํ ์ํ ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ์ ๋จธ๋ฆฌ ์ 1๋ฏธํฐ์ ๋ฐฐ์นํ๋ ค๋ฉด ๋จผ์ XRFrame.getViewerPose()
๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ์ด์ ํฌ์ฆ๋ฅผ ์ป์ต๋๋ค. ๊ทธ๋ฐ ๋ค์, ๋ทฐ์ด์ ์ฐธ์กฐ ๊ณต๊ฐ Z์ถ์ ๋ฐ๋ผ ๊ฐ์ฒด๋ฅผ 1๋ฏธํฐ ์ด๋์ํค๋ ๋ณํ ํ๋ ฌ์ ์์ฑํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก, ์ด ๋ณํ์ ๊ฐ์ฒด์ ์์น์ ์ ์ฉํ์ฌ ์ฌ๋ฐ๋ฅธ ์์น์ ๋ฐฐ์นํฉ๋๋ค.
์์ : gl-matrix๋ก ์ขํ ๋ณํํ๊ธฐ
๋ค์์ gl-matrix๋ฅผ ์ฌ์ฉํ์ฌ ์ขํ๋ฅผ ๋ณํํ๋ ๊ฐ๋จํ ์๋ฐ์คํฌ๋ฆฝํธ ์์ ์ ๋๋ค:
// Import gl-matrix functions
import { mat4, vec3 } from 'gl-matrix';
// Define a point in local space
const localPoint = vec3.fromValues(1, 2, 3); // X, Y, Z coordinates
// Create a transformation matrix (example: translate by (4, 5, 6))
const transformMatrix = mat4.create();
mat4.translate(transformMatrix, transformMatrix, vec3.fromValues(4, 5, 6));
// Create a vector to store the transformed point
const worldPoint = vec3.create();
// Apply the transformation
vec3.transformMat4(worldPoint, localPoint, transformMatrix);
// worldPoint now contains the transformed coordinates
console.log("Transformed Point:", worldPoint);
WebXR ์ขํ๊ณ ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
ํจ๊ณผ์ ์ธ ์ขํ๊ณ ๊ด๋ฆฌ๋ ์ ํํ๊ณ ์์ ์ ์ด๋ฉฐ ์ง๊ด์ ์ธ XR ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ค์์ ๋ฐ๋ผ์ผ ํ ๋ช ๊ฐ์ง ๋ชจ๋ฒ ์ฌ๋ก์ ๋๋ค:
- ์ฌ๋ฐ๋ฅธ ์ฐธ์กฐ ๊ณต๊ฐ ์ ํ: ๊ฐ ์ฐธ์กฐ ๊ณต๊ฐ์ ํน์ฑ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ ๊ฐ์ฅ ์ ํฉํ ๊ฒ์ ์ ํํ์ญ์์ค.
- ์ฐธ์กฐ ๊ณต๊ฐ ์ ํ ์ต์ํ: ์ฐธ์กฐ ๊ณต๊ฐ์ ์์ฃผ ์ ํํ๋ฉด ์ฑ๋ฅ ์ค๋ฒํค๋์ ์ ์ฌ์ ์ธ ๋ถ์ ํ์ฑ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฐธ์กฐ ๊ณต๊ฐ ์ ํ ํ์๋ฅผ ์ต์ํํ์ญ์์ค.
- ๋ณํ ํ๋ ฌ ํจ์จ์ ์ฌ์ฉ: ๋ณํ ํ๋ ฌ์ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ญ๋๋ค. ๋ถํ์ํ ๋ณํ์ ์์ฑํ๊ณ ์ ์ฉํ๋ ๊ฒ์ ํผํ์ญ์์ค. ๊ฐ๋ฅํ๋ฉด ๋ณํ ํ๋ ฌ์ ์บ์ํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํค์ญ์์ค.
- ์ขํ๊ณ ์ฐจ์ด ์ฒ๋ฆฌ: ์๋ก ๋ค๋ฅธ XR ์ฅ์น์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฐ์ ์ขํ๊ณ ๊ท์น ์ฐจ์ด์ ์ ์ํ์ญ์์ค. ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด๋ฌํ ์ฐจ์ด๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋์ง ํ์ธํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ๊ตฌํ ์์คํ ์ด๋ ์ฝํ ์ธ ๋ ์ผ์ ์ขํ๊ณ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ฒ ์ ํ ํ ์คํธ: ๋ค์ํ XR ์ฅ์น์ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒ ์ ํ ํ ์คํธํ์ฌ ์ขํ๊ณ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ์ญ์์ค. ์ ํ์ฑ, ์์ ์ฑ ๋ฐ ์ฑ๋ฅ์ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ญ์์ค.
- ํฌ์ฆ ํํ ์ดํด: WebXR ํฌ์ฆ(
XRPose
)๋ ์์น์ ๋ฐฉํฅ(์ฟผํฐ๋์ธ)์ ๋ชจ๋ ํฌํจํฉ๋๋ค. ๋ ๊ตฌ์ฑ ์์๋ฅผ ๋ชจ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์ถ์ถํ๊ณ ์ฌ์ฉํ๋์ง ํ์ธํ์ญ์์ค. ๊ฐ๋ฐ์๋ค์ ์ข ์ข ํฌ์ฆ๊ฐ *์ค์ง* ์์น ๋ฐ์ดํฐ๋ง ํฌํจํ๋ค๊ณ ์๋ชป ๊ฐ์ ํฉ๋๋ค. - ์ง์ฐ ์๊ฐ ๊ณ ๋ ค: XR ์ฅ์น์๋ ๋ด์ฌ๋ ์ง์ฐ ์๊ฐ์ด ์์ต๋๋ค. ์ด ์ง์ฐ ์๊ฐ์ ๋ณด์ํ๊ณ ์์ ์ฑ์ ํฅ์์ํค๊ธฐ ์ํด ํฌ์ฆ๋ฅผ ์์ธกํ์ญ์์ค. WebXR Device API๋ ํฌ์ฆ๋ฅผ ์์ธกํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ์ฌ ์ฒด๊ฐ๋๋ ์ง์ฐ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์๋ ์ค์ผ์ผ ์ ์ง: ์๋ ์ค์ผ์ผ์ ์ผ๊ด๋๊ฒ ์ ์งํ์ญ์์ค. ์ฌ์์ ๊ฐ์ฒด๋ฅผ ์์๋ก ์ค์ผ์ผ๋งํ๋ ๊ฒ์ ๋ ๋๋ง ์ํฐํฉํธ์ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์์ผ๋ฏ๋ก ํผํ์ญ์์ค. ๊ฐ์ ๋จ์์ ์ค์ ๋จ์ ๊ฐ์ 1:1 ๋งคํ์ ์ ์งํ๋๋ก ๋ ธ๋ ฅํ์ญ์์ค.
์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ
WebXR์์ ์ขํ๊ณ๋ก ์์ ํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ผ๋ฉฐ, ์ค์ํ๊ธฐ ์ฝ์ต๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ํจ์ ๊ณผ ์ด๋ฅผ ํผํ๋ ๋ฐฉ๋ฒ์ ๋๋ค:
- ์๋ชป๋ ํ๋ ฌ ๊ณฑ์ ์์: ํ๋ ฌ ๊ณฑ์ ์ ๊ตํ ๋ฒ์น์ด ์ฑ๋ฆฝํ์ง ์์ผ๋ฏ๋ก, ํ๋ ฌ์ ๊ณฑํ๋ ์์๊ฐ ์ค์ํฉ๋๋ค. ์ํ๋ ๋ณํ์ ์ป์ผ๋ ค๋ฉด ํญ์ ์ฌ๋ฐ๋ฅธ ์์๋ก ํ๋ ฌ์ ๊ณฑํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค. ์ผ๋ฐ์ ์ผ๋ก ๋ณํ์ ํฌ๊ธฐ ์กฐ์ , ํ์ , ์ด๋(SRT) ์์๋ก ์ ์ฉ๋ฉ๋๋ค.
- ๋ก์ปฌ ์ขํ์ ์๋ ์ขํ ํผ๋: ๋ก์ปฌ ์ขํ(๊ฐ์ฒด ์์ ์ ์ขํ๊ณ์ ๋ํ ์๋์ ์ขํ)์ ์๋ ์ขํ(์ฌ์ ์ ์ญ ์ขํ๊ณ์ ๋ํ ์๋์ ์ขํ)๋ฅผ ๊ตฌ๋ณํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ฐ ์์ ์ ์ฌ๋ฐ๋ฅธ ์ขํ๊ณ๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ์ญ์์ค.
- ์ขํ๊ณ ์์ก์ด ๊ท์น ๋ฌด์: ์์ ์ธ๊ธํ๋ฏ์ด WebXR์ ์ผ๋ฐ์ ์ผ๋ก ์ค๋ฅธ์ ์ขํ๊ณ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ถ ์ฝํ ์ธ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ผ์ ์ขํ๊ณ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ฐจ์ด์ ์ ์ธ์งํ๊ณ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ์ญ์์ค.
- ๋ ๋์ด ๋ฏธ๊ณ ๋ ค: ๋ทฐ์ด ์ฐธ์กฐ ๊ณต๊ฐ์ ์ฌ์ฉํ ๋, ์์ ์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ์์ ๋ ๋ ์ฌ์ด์ ์์นํฉ๋๋ค. ๊ฐ์ฒด๋ฅผ ์ฌ์ฉ์์ ๋๋์ด์ ๋ฐฐ์นํ๋ ค๋ฉด ์ฌ์ฉ์์ ๋ ๋์ด๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
XRFrame.getViewerPose()
๊ฐ ๋ฐํํ๋XREye
๊ฐ์ฒด์์ ์ด ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค. - ๋๋ฆฌํํธ ๋์ : AR ๊ฒฝํ์์ ํธ๋ํน์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋๋ฆฌํํธ๊ฐ ๋ฐ์ํ์ฌ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์ค์ ์ธ๊ณ์ ์ด๊ธ๋๊ฒ ๋ ์ ์์ต๋๋ค. ๋ฃจํ ํด๋ก์ (loop closure)๋ ์๊ฐ-๊ด์ฑ ์ฃผํ ๊ฑฐ๋ฆฌ ์ธก์ (VIO)๊ณผ ๊ฐ์ ๊ธฐ์ ์ ๊ตฌํํ์ฌ ๋๋ฆฌํํธ๋ฅผ ์ํํ๊ณ ์ ๋ ฌ์ ์ ์งํ์ญ์์ค.
๊ณ ๊ธ ์ฃผ์ : ์ต์ปค์ ๊ณต๊ฐ ๋งคํ
๊ธฐ๋ณธ์ ์ธ ์ขํ ๋ณํ ์ธ์๋ WebXR์ ๊ณต๊ฐ ์ดํด๋ฅผ ์ํ ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค:
- ์ต์ปค(Anchors): ์ต์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ๊ฐ์ฒด์ ์ค์ ์ธ๊ณ ์ฌ์ด์ ์ง์์ ์ธ ๊ณต๊ฐ ๊ด๊ณ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ต์ปค๋ ์์คํ ์ด ํ๊ฒฝ์ ๋ํด ๊ณ ์ ๋ ์ํ๋ก ์ ์งํ๋ ค๊ณ ์๋ํ๋ ๊ณต๊ฐ์์ ํ ์ง์ ์ ๋๋ค. ์ฅ์น๊ฐ ์ผ์์ ์ผ๋ก ์ถ์ ์ ์๋๋ผ๋, ์ถ์ ์ด ๋ณต์๋๋ฉด ์ต์ปค๋ ์์ฒด์ ์ผ๋ก ์์น๋ฅผ ๋ค์ ์ฐพ์ผ๋ ค๊ณ ์๋ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์์ง์ด๊ฑฐ๋ ์ฅ์น์ ์ถ์ ์ด ์ค๋จ๋๋๋ผ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ํน์ ๋ฌผ๋ฆฌ์ ์์น์ ๊ณ ์ ์์ผ์ผ ํ๋ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
- ๊ณต๊ฐ ๋งคํ(Spatial Mapping): ๊ณต๊ฐ ๋งคํ(์ฅ๋ฉด ์ดํด ๋๋ ์๋ ํธ๋ํน์ด๋ผ๊ณ ๋ ํจ)์ ์์คํ ์ด ์ฌ์ฉ์ ํ๊ฒฝ์ 3D ํํ์ ์์ฑํ๋๋ก ํฉ๋๋ค. ์ด ํํ์ ์ค์ ๊ฐ์ฒด ๋ค์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌ๊ฑฐ๋(occlusion), ๊ฐ์ ๊ฐ์ฒด์ ์ค์ ๊ฐ์ฒด ๊ฐ์ ๋ฌผ๋ฆฌ์ ์ํธ์์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ฉฐ, ๋ ๋ชฐ์ ๊ฐ ์๊ณ ์ฌ์ค์ ์ธ XR ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ๊ณต๊ฐ ๋งคํ์ ๋ณดํธ์ ์ผ๋ก ์ง์๋์ง ์์ผ๋ฉฐ ํน์ ํ๋์จ์ด ๊ธฐ๋ฅ์ด ํ์ํฉ๋๋ค.
์ง์์ ์ธ ๊ณต๊ฐ ๊ด๊ณ๋ฅผ ์ํ ์ต์ปค ์ฌ์ฉํ๊ธฐ
์ต์ปค๋ฅผ ์์ฑํ๋ ค๋ฉด ๋จผ์ ์ต์ปค์ ์ํ๋ ์์น๋ฅผ ๋ํ๋ด๋ XRFrame
๊ณผ XRPose
๋ฅผ ์ป์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์, XRPose
๋ฅผ ์ ๋ฌํ์ฌ XRFrame.createAnchor()
๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค. ์ด ๋ฉ์๋๋ ์๋ก ์์ฑ๋ ์ต์ปค๋ฅผ ๋ํ๋ด๋ XRAnchor
๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
๋ค์ ์ฝ๋ ์ค๋ํซ์ ์ต์ปค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค:
// Get the XRFrame and XRPose
const pose = frame.getPose(hitTestResult.localPose, localReferenceSpace);
// Create the anchor
const anchor = frame.createAnchor(pose);
// Handle errors
if (!anchor) {
console.error("Failed to create anchor.");
return;
}
// The anchor is now created and will attempt to maintain its
// position relative to the real world.
๊ธ๋ก๋ฒ ์ ๊ทผ์ฑ ๊ณ ๋ ค์ฌํญ
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ WebXR ๊ฒฝํ์ ์ค๊ณํ ๋ ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ค์๊ณผ ๊ฐ์ ์์๊ฐ ํฌํจ๋ฉ๋๋ค:
- ์ธ์ด ์ง์: ๋ชจ๋ ํ ์คํธ ๋ฐ ์ค๋์ค ์ฝํ ์ธ ์ ๋ํ ๋ฒ์ญ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฌธํ์ ๋ฏผ๊ฐ์ฑ: ๋ฌธํ์ ์ฐจ์ด๋ฅผ ์ ๋ ํ๊ณ ํน์ ๋ฌธํ๊ถ์์ ๋ถ์พํ๊ฑฐ๋ ๋ถ์ ์ ํ ์ ์๋ ์ด๋ฏธ์ง๋ ์ธ์ด ์ฌ์ฉ์ ํผํฉ๋๋ค.
- ์ ๋ ฅ ๋ฐฉ๋ฒ: ์ปจํธ๋กค๋ฌ, ์์ฑ ๋ช ๋ น, ์์ ๊ธฐ๋ฐ ์ํธ์์ฉ ๋ฑ ๋ค์ํ ์ ๋ ฅ ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค.
- ๋ฉ๋ฏธ: ๋น ๋ฅด๊ฑฐ๋ ๊ฐ์์ค๋ฌ์ด ์์ง์์ ํผํ๊ณ , ์์ ์ ์ธ ๊ธฐ์ค ํ๋ ์์ ์ ๊ณตํ๋ฉฐ, ์ฌ์ฉ์๊ฐ ์์ผ๊ฐ์ ์กฐ์ ํ ์ ์๋๋ก ํ์ฌ ๋ฉ๋ฏธ๋ฅผ ์ต์ํํฉ๋๋ค.
- ์๊ฐ ์ฅ์ : ํ ์คํธ ๋ฐ ๊ธฐํ ์๊ฐ ์์์ ํฌ๊ธฐ์ ๋๋น๋ฅผ ์กฐ์ ํ ์ ์๋ ์ต์ ์ ์ ๊ณตํฉ๋๋ค. ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์ค๋์ค ํ ์ฌ์ฉ์ ๊ณ ๋ คํฉ๋๋ค.
- ์ฒญ๊ฐ ์ฅ์ : ๋ชจ๋ ์ค๋์ค ์ฝํ ์ธ ์ ๋ํ ์๋ง์ด๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ถ๊ฐ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ธฐ ์ํด ์๊ฐ์ ํ ์ฌ์ฉ์ ๊ณ ๋ คํฉ๋๋ค.
๊ฒฐ๋ก
์ขํ๊ณ ๊ด๋ฆฌ๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ๋งค๋ ฅ์ ์ด๊ณ ์ ํํ WebXR ๊ฒฝํ์ ๊ตฌ์ถํ๋ ๋ฐ ๊ทผ๋ณธ์ ์ ๋๋ค. ์ฐธ์กฐ ๊ณต๊ฐ, ์ขํ ๋ณํ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํจ์ผ๋ก์จ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํด ๋ชฐ์ ๊ฐ ์๊ณ ์ง๊ด์ ์ธ XR ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค. As WebXR ๊ธฐ์ ์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, ์ด๋ฌํ ํต์ฌ ๊ฐ๋ ์ ๋ํ ํ์คํ ์ดํด๋ ๋ชฐ์ ํ ์น ๊ฒฝํ์ ํ๊ณ๋ฅผ ๋ฐ์ด๋์ผ๋ ค๋ ๊ฐ๋ฐ์์๊ฒ ๋์ฑ ์ค์ํด์ง ๊ฒ์ ๋๋ค.
์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ WebXR์ ์ขํ๊ณ ๊ด๋ฆฌ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ผ์๋ ๊ฐ๋ ๊ณผ ๊ธฐ์ ์ ์คํํด๋ณด๊ณ , ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ํด WebXR API ๋ฌธ์๋ฅผ ํ์ํด ๋ณด์๊ธฐ๋ฅผ ๊ถ์ฅํฉ๋๋ค. ์ด๋ฌํ ์์น์ ๋ฐ์๋ค์์ผ๋ก์จ WebXR์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ง์ ์ผ๋ก ํ์ ์ ์ธ XR ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค.