- Canvas, Engine, Scene, Camera
- Math.PI์ ๋ผ๋์
- segments
- Shaders
- Colors
- Lights
- Shadow
- Engine Options
- Material
- Inspector
Babylon.js์์ 3D ๊ทธ๋ํฝ์ค๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ํ์์ ์ธ ์์๋ค์ด๋ค.
- Canvas:
- Canvas๋ ์น ํ์ด์ง์ ๊ทธ๋ํฝ์ ๊ทธ๋ฆฌ๊ธฐ ์ํ HTML ์์์ด๋ค. WebGL๊ณผ Babylon.js๋ ์ด Canvas ์์์ ๊ทธ๋ํฝ์ค๋ฅผ ๋ ๋๋งํ๋ค.
- Canvas๋ 2D ๋ฐ 3D ๊ทธ๋ํฝ์ค๋ฅผ ์ํ ๊ทธ๋ฆฌ๊ธฐ ์์ญ์ ์ ๊ณตํ๋ฉฐ, JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ์กฐ์ํ ์ ์๋ค.
- Engine:
- Engine์ Babylon.js์ ํต์ฌ ๊ตฌ์ฑ ์์๋ก, WebGL ๋ ๋๋ง ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํ๋ค. ์ด๋ 3D ๊ทธ๋ํฝ์ค๋ฅผ ๋ ๋๋งํ๊ธฐ ์ํ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ธ ์ค์ ๊ณผ ์ฒ๋ฆฌ๋ฅผ ๋ด๋นํ๋ค.
- Engine์ Canvas์ ์ฐ๋๋์ด ์์ผ๋ฉฐ, ๋ ๋๋ง ๋ฃจํ์ ํจ๊ป ์๋ํ์ฌ ์ค์๊ฐ์ผ๋ก 3D ๊ทธ๋ํฝ์ค๋ฅผ ํ๋ฉด์ ํ์ํ๋ค.
- Scene:
- Scene์ 3D ๊ทธ๋ํฝ์ค๊ฐ ๋ ๋๋ง๋๋ ํ๊ฒฝ์ด๋ค. ์ด๋ ๋ชจ๋ 3D ๊ฐ์ฒด, ์นด๋ฉ๋ผ, ๋ผ์ดํธ, ๋ฌผ๋ฆฌ์ ํน์ฑ ๋ฑ์ ํฌํจํ๋ ์ปจํ ์ด๋๋ค.
- Scene์ ๊ฐ์์ 3D ์ธ๊ณ๋ฅผ ๋ํ๋ด๋ฉฐ, ์ฌ์ฉ์๊ฐ ๋ง๋ค๊ณ ์ ํ๋ 3D ํ๊ฒฝ์ ๋ชจ๋ ์์๋ฅผ ๊ตฌ์ฑํ๋ค.
- Camera:
- Camera๋ 3D Scene์์์ ๊ด์ ์ ์ ์ํ๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ 3D ๊ณต๊ฐ์ ์ด๋ป๊ฒ ๋ณด๊ณ ์ธ์ํ๋์ง ๊ฒฐ์ ํ๋ค.
- Babylon.js์์ ๋ค์ํ ์ ํ์ ์นด๋ฉ๋ผ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ค์ ํ์ , ์ค, ์ด๋ ๋ฑ ๋ค์ํ ๋ฐฉ์์ผ๋ก Scene์ ๊ด์ฐฐํ ์ ์๊ฒ ํ๋ค.
- ๋ผ๋์์ ์ ์์ ์ค์์ฑ:
- ๋ผ๋์์ ๊ฐ๋๋ฅผ ์ธก์ ํ๋ ๋จ์์ด๋ค.
- ์์ ์ค์ฌ์์ ๋ฐ์ง๋ฆ ๊ธธ์ด๋งํผ ์์ ๋๋ ๋ฅผ ๋ฐ๋ผ ์ด๋ํ์ ๋์ ๊ฐ์ด 1 ๋ผ๋์์ด๋ค.
- 360๋๋ ์ฝ 2ฯ ๋ผ๋์๊ณผ ๊ฐ์ผ๋ฉฐ, ์ด๋ ์ ํ ๋ฐํด๋ฅผ ๋๋ ๊ฐ๋์ด๋ค.
- ๋ผ๋์์ ์ปดํจํฐ ๊ทธ๋ํฝ์ค์ ์ํ ๊ณ์ฐ์์ ํจ์จ์ ์ด๊ณ ํ์คํ๋ ๋ฐฉ์์ ์ ๊ณตํ๋ค.
- Math.PI์ ์ญํ ๊ณผ ์ฌ์ฉ:
Math.PI
๋ ์์ฃผ์จ ฯ๋ฅผ ๋ํ๋ด๋ ์์์ด๋ค.- ๊ฐ๋๋ฅผ ๋ผ๋์์ผ๋ก ํํํ ๋
Math.PI
๋ฅผ ์ฌ์ฉํ๋ค. - ์๋ฅผ ๋ค์ด, ๊ฐ์ฒด๋ฅผ 180๋ ํ์ ์ํค๋ ค๋ฉด
Math.PI
(ฯ ๋ผ๋์)๋ฅผ ์ฌ์ฉํ๋ค. Math.PI
๋ ์ง์ ์ ์ธ ๋ผ๋์ ๊ณ์ฐ์ ์ฌ์ฉ๋๋ฉฐ, ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ํ์ ์ ์ ํฉํ๋ค.
- BABYLON.Tools.ToRadians์ ์ฌ์ฉ๊ณผ ๋ฉ์ปค๋์ฆ:
BABYLON.Tools.ToRadians
ํจ์๋ ๋ ๋จ์์ ๊ฐ๋๋ฅผ ๋ผ๋์์ผ๋ก ๋ณํํ๋ค.- ๋ด๋ถ์ ์ผ๋ก
๊ฐ๋ / 180 * Math.PI
๋ผ๋ ๊ณต์์ ์ฌ์ฉํ๋ค. - ์ด ํจ์๋ ์ฌ์ฉ์๊ฐ ๋ ๋จ์๋ก ์ฃผ์ด์ง ๊ฐ๋๋ฅผ ๋ผ๋์์ผ๋ก ์ฝ๊ฒ ๋ณํํ ์ ์๊ฒ ํ๋ค.
BABYLON.Tools.ToRadians
๋ ์ฌ์ฉ์๊ฐ ํน์ ๊ฐ๋๋ฅผ ์ง์ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ์ ์ ํฉํ๋ค.
- Babylon.js์์์ ํ์ ์์:
- Babylon.js์์ ๋ฐ์ค๋ฅผ ์์ฑํ๊ณ ํ์ ์ํค๋ ์์:
var box = BABYLON.MeshBuilder.CreateBox("box", {size: 1}, scene); box.position.x = -2; box.position.y = 0.5; box.rotation = new BABYLON.Vector3(0, BABYLON.Tools.ToRadians(60), 0);
- ์ด ์ฝ๋์์
BABYLON.Tools.ToRadians(60)
์ 60๋๋ฅผ ๋ผ๋์์ผ๋ก ๋ณํํ๋ค. - ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฐ์ค๋ y์ถ์ ์ค์ฌ์ผ๋ก ์ฝ 1.047 ๋ผ๋์(60๋์ ํด๋น)๋งํผ ํ์ ํ๋ค.
- Segments์ ์ ์์ ์ฌ์ฉ:
segments
๋ Babylon.js์์ 3D ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋ ๊ฐ์ฒด์ ํ๋ฉด์ ์ด๋ฃจ๋ ์ธ๋ถํ๋ ๋ถ๋ถ์ ์๋ฅผ ๋ํ๋ธ๋ค.- ๋์
segments
๊ฐ์ ๋ ๋ง์ ๋ค๊ฐํ์ ์์ฑํ์ฌ ๊ฐ์ฒด์ ํ๋ฉด์ ๋ ์ธ๋ฐํ๊ฒ ๋ง๋ ๋ค. - ์ด๋ ๊ฐ์ฒด์ ๊ณก์ ์ด๋ ์ํ ๋ถ๋ถ์ด ๋ ๋ถ๋๋ฝ๊ณ ์์ฐ์ค๋ฝ๊ฒ ๋ณด์ด๊ฒ ํ๋ ๋ฐ ๋์์ด ๋๋ค.
- ํ์ง๋ง
segments
๊ฐ์ด ๋์์๋ก ๋ ๋ง์ ๊ณ์ฐ์ด ํ์ํ๊ณ , ๊ทธ๋ํฝ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์๋ค.
- Babylon.js์์์ Segments ์์:
- Babylon.js์์ ๊ตฌ์ฒด๋ฅผ ์์ฑํ๊ณ ,
segments
๋ฅผ ์กฐ์ ํ์ฌ ๊ตฌ์ฒด์ ์ธ๋ถ ์ ๋๋ฅผ ๋ณ๊ฒฝํ๋ ์์:var sphere = BABYLON.MeshBuilder.CreateSphere("sphere", {diameter: 1, segments: 16}, scene); sphere.position = new BABYLON.Vector3(0, 1, 0);
- ์ด ์ฝ๋์์
CreateSphere
ํจ์๋ ๊ตฌ์ฒด๋ฅผ ์์ฑํ๋ค. segments: 16
์ ๊ตฌ์ฒด์ ํ๋ฉด์ 16๊ฐ์ ์ธ๊ทธ๋จผํธ๋ก ๋๋์ด ์ธ๋ฐํ๊ฒ ํํํ๋ค.- ๊ฒฐ๊ณผ์ ์ผ๋ก ์์ฑ๋ ๊ตฌ์ฒด๋ ๋ ๋ง์ ๋ค๊ฐํ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ด ๋ ๋ถ๋๋ฌ์ด ๊ณก์ ์ ๊ฐ์ง๋ค.
๋ฒํ
์ค ์
ฐ์ด๋(Vertex Shader)์ ํ๋๊ทธ๋จผํธ ์
ฐ์ด๋(Fragment Shader)๋ 3D ๊ทธ๋ํฝ ๋ ๋๋ง ๊ณผ์ ์์ ์ค์ํ ์ญํ ์ ํ๋ค.
์ด๋ค์ GPU์ ์
ฐ์ด๋ ํ์ดํ๋ผ์ธ์ ํต์ฌ ๊ตฌ์ฑ ์์์ด๋ค.
- ๋ฒํ ์ค ์ ฐ์ด๋:
- ๋ฒํ ์ค ์ ฐ์ด๋๋ 3D ๋ชจ๋ธ์ ๊ฐ ์ ์ (vertex)์ ๋ํด ์คํ๋๋ค. ์ด ์ ฐ์ด๋์ ์ฃผ์ ๋ชฉ์ ์ ์ ์ ์ ์์น, ์์, ์ง๊ฐ ์ขํ, ์ ์ ์ ์ ์ฉ๋๋ ๊ด์ ์ ๋ณด ๋ฑ์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด๋ค.
- ๋ฒํ ์ค ์ ฐ์ด๋๋ ๋ชจ๋ธ์ ํ๋ฉด์ ํฌ์ํ๊ธฐ ์ ์ ๋ชจ๋ธ์ ์ ์ ์ ๋ณํํ๋ค. ์ด๋ ์ฃผ๋ก ์ ์ ์ ์์น๋ฅผ ๋ณ๊ฒฝํ๊ณ , ๊ด์ ํจ๊ณผ๋ฅผ ๊ณ์ฐํ๋ฉฐ, ์นด๋ฉ๋ผ ๋ทฐ์ ๋ง๊ฒ ์ ์ ์ ์กฐ์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ๋ฒํ ์ค ์ ฐ์ด๋๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ฒ์์ ์์นํ๋ฉฐ, ๊ฐ ์ ์ ์ ๋ํด ํ ๋ฒ์ฉ ์คํ๋๋ค.
- ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋:
- ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ํ๋ฉด์ ๊ทธ๋ ค์ง ๊ฐ ํฝ์ (fragment)์ ๋ํด ์คํ๋๋ค. ์ด ์ ฐ์ด๋์ ๋ชฉ์ ์ ํฝ์ ์ ์ต์ข ์์๊ณผ ๋ค๋ฅธ ํน์ฑ์ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
- ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ํ ์ค์ฒ ๋งคํ, ์์ ํผํฉ, ๊ด์ ํจ๊ณผ ๋ฑ์ ๊ณ์ฐํ์ฌ ๊ฐ ํฝ์ ์ ์ ์ฉํ๋ค. ์ด๋ ๋ฌผ์ฒด์ ํ๋ฉด ์ง๊ฐ๊ณผ ๋น์ ์ํธ์์ฉ์ ๋ ๋๋งํ๋ ๋ฐ ์ค์ํ๋ค.
- ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ๋ท๋ถ๋ถ์ ์์นํ๋ฉฐ, ๋ฒํ ์ค ์ ฐ์ด๋์ ์ํด ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ค. ๋ ๋๋งํ ๊ฐ ํฝ์ ์ ๋ํด ํ ๋ฒ์ฉ ์คํ๋๋ค.
- ์ด ์ ฐ์ด๋๋ ํ๋ฉด์ ํ์๋ ์ต์ข ์ด๋ฏธ์ง์ ํ์ง๊ณผ ์ธ๋ถ ์ฌํญ์ ํฌ๊ฒ ๊ฒฐ์ ํ๋ค. ์๋ฅผ ๋ค์ด, ํฝ์ ๋ณ ๊ด์ ๊ณ์ฐ, ๊ทธ๋ฆผ์ ํจ๊ณผ, ๋ฐ์ฌ ๋ฐ ๊ดํ ํจ๊ณผ ๋ฑ์ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ๋ฒํ ์ค ์ ฐ์ด๋์ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋์ ์ํธ์์ฉ:
- ๋ฒํ ์ค ์ ฐ์ด๋๋ ๋จผ์ ์คํ๋์ด ๊ฐ ์ ์ ์ ์์น์ ์์ฑ์ ๊ฒฐ์ ํ๋ค. ์ดํ ์ด ๋ฐ์ดํฐ๋ ๋์คํฐํ ๊ณผ์ ์ ๊ฑฐ์ณ ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ก ์ ๋ฌ๋๋ค.
- ํ๋๊ทธ๋จผํธ ์ ฐ์ด๋๋ ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ํฝ์ ์ ์ต์ข ์์๊ณผ ํ ์ค์ฒ๋ฅผ ๊ฒฐ์ ํ๋ค. ์ด ๊ณผ์ ์์ ๋ฒํ ์ค ์ ฐ์ด๋๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ ์ ๋ณด์ ํ ์ค์ฒ, ๋ผ์ดํ ์ ๋ณด ๋ฑ์ ๊ฒฐํฉํ์ฌ ํฝ์ ๋ณ๋ก ์ฒ๋ฆฌํ๋ค.
- ์ด ๋ ์ ฐ์ด๋์ ์กฐํฉ์ 3D ๊ทธ๋ํฝ์ค์์ ๋ฌผ์ฒด์ ํํ, ์์, ์กฐ๋ช , ์ง๊ฐ ๋ฑ์ ์ ๊ตํ๊ฒ ํํํ๋ ๋ฐ ํ์์ ์ด๋ค. ์ด๋ค์ GPU์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ํ์ฉํ์ฌ ๊ณ ์ฑ๋ฅ ๊ทธ๋ํฝ ๋ ๋๋ง์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
BabylonJS์์ ์ฌ์ฉ๋๋ 'Diffuse Color', 'Ambient Color', ๊ทธ๋ฆฌ๊ณ 'Specular Color'๋ 3D ๋ชจ๋ธ๋ง์์ ์ค์ํ ์ญํ ์ ํ๋ ์ฌ์ง์ ์์ฑ๋ค์ด๋ค.
- Diffuse Color (ํ์ฐ ์์):
- ์ด ์์ฑ์ ๋ฌผ์ฒด์ ๊ธฐ๋ณธ ์์์ด๋ผ๊ณ ํ ์ ์๋ค.
- ๋ฌผ์ฒด์ ๋น์ด ๋ฟ์์ ๋, ๊ทธ ๋น์ด ์ด๋ป๊ฒ ํ๋ฉด์์ ๋ฐ์ฌ๋๋์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
- ํ์ฐ ์์์ ๋ฌผ์ฒด์ ํ๋ฉด์์ ๊ณ ๋ฅด๊ฒ ํผ์ ธ ๋๊ฐ๋ ๋น์ ์์์ ๋ํ๋ธ๋ค.
- ์๋ฅผ ๋ค์ด, ๋นจ๊ฐ ์ฌ๊ณผ์ ๊ฒฝ์ฐ, ํ์ฐ ์์์ '๋นจ๊ฐ'์ผ ๊ฒ์ด๋ค.
- Ambient Color (์ฃผ๋ณ๊ด ์์):
- ์ด๋ ๋ฌผ์ฒด๊ฐ ๋ฐ๋ ๊ฐ์ ๊ด์ ์์์ ๋ํ๋ธ๋ค.
- ์ฃผ๋ณ๊ด์ ์ฃผ๋ณ ํ๊ฒฝ์์ ๋ฐ์ฌ๋์ด ์ค๋ ๋น์ผ๋ก, ์ง์ ์ ์ธ ๊ด์์ด ์๋ ์ฃผ๋ณ์ ๋น์ ์๋ฏธํ๋ค.
- ์ฃผ๋ณ๊ด ์์์ ์ฃผ๋ก ๋ฌผ์ฒด๊ฐ ์ด๋ค ์์์ ๋น์ ๊ฐ์ ์ ์ผ๋ก ๋ฐ์ฌํ๋์ง๋ฅผ ์ ์ํ๋ค.
- ์๋ฅผ ๋ค์ด, ํธ๋ฅธ์์ ๋ฐฉ์์ ๋ฌผ์ฒด๋ ํธ๋ฅธ์์ ์ฃผ๋ณ๊ด์ ๋ฐ์ ๊ฒ์ด๋ค.
- Specular Color (๋ฐ์ฌ ์์):
- ์ด ์์ฑ์ ๋ฌผ์ฒด์ ๊ดํ ๋๋ ๋ฐ์ฌํ๋ ๋ฅ๋ ฅ์ ๋ํ๋ธ๋ค.
- ๋น์ด ๋ฌผ์ฒด์ ํน์ ๋ถ๋ถ์ ์ง์ ๋ฟ์ ๋ฐ์ฌ๋ ๋ ๋ํ๋๋ ๊ฐ๋ ฌํ ํ์ด๋ผ์ดํธ์ ์์์ด๋ค.
- ๋ฐ์ฌ ์์์ ๋ฌผ์ฒด๊ฐ ๋น๋๋ ์ ๋์ ๊ทธ ๋น์ ์์์ ๊ฒฐ์ ํ๋ค.
- ์๋ฅผ ๋ค์ด, ๋ฐ์ง๋ฐ์งํ ๊ธ์ ํ๋ฉด์ ๊ฐํ ๋ฐ์ฌ ์์์ ๊ฐ์ง ๊ฒ์ด๋ค.
BabylonJS์ ๊ฐ์ 3D ๊ทธ๋ํฝ ํ๊ฒฝ์์ 'Diffuse Light', 'Ambient Light', ๊ทธ๋ฆฌ๊ณ 'Specular Light'๋ ์กฐ๋ช ์ ์ธ ๊ฐ์ง ์ฃผ์ ์์ฑ์ ๋ํ๋ธ๋ค. ์ด๋ค ๊ฐ๊ฐ์ ๋ฌผ์ฒด๊ฐ ๋น์ ์ด๋ป๊ฒ ๋ฐ๊ณ ๋ฐ์ฌํ๋์ง์ ๋ํ ๋ค๋ฅธ ์ธก๋ฉด์ ๊ฐ์กฐํ๋ค:
- Diffuse Light (ํ์ฐ๊ด):
- ํ์ฐ๊ด์ ๋ฌผ์ฒด์ ํ๋ฉด์ ๊ณ ๋ฅด๊ฒ ํผ์ง๋ ๋น์ ์๋ฏธํ๋ค.
- ์ด๋ ๋ฌผ์ฒด์ ๊ธฐ๋ณธ ์์์ ๊ฒฐ์ ํ๋ฉฐ, ๋ฌผ์ฒด์ ๋น์ด ๋ฟ์ผ๋ฉด ๊ทธ ๋น์ด ์ฌ๋ฌ ๋ฐฉํฅ์ผ๋ก ํ์ฐ๋์ด ๋ถ๋๋ฌ์ด ๊ทธ๋ฆผ์๋ฅผ ๋ง๋ ๋ค.
- ํ์ฐ๊ด์ ๋ฌผ์ฒด์ ํํ์ ์ง๊ฐ์ ์ ๋๋ฌ๋ด์ฃผ์ด, ๋ฌผ์ฒด๊ฐ ๋น์ ๋ฐ๋ ๋ฐฉ์์ ์์ฐ์ค๋ฝ๊ฒ ํํํ๋ค.
- ์๋ฅผ ๋ค์ด, ๋ง์ ๋ ํ๋น์ ๋ฐ๋ ๋ฌผ์ฒด๋ ์ฃผ๋ณ๋ณด๋ค ๋ฐ๊ฒ ๋ณด์ด๋ฉฐ, ๊ทธ๋ฆผ์๊ฐ ๋ถ๋๋ฝ๊ฒ ํผ์ง๋ค.
- Ambient Light (์ฃผ๋ณ๊ด):
- ์ฃผ๋ณ๊ด์ ์ง์ ์ ์ธ ๊ด์์ผ๋ก๋ถํฐ ์ค๋ ๊ฒ์ด ์๋๋ผ, ์ฃผ๋ณ ํ๊ฒฝ์์ ๋ฐ์ฌ๋์ด ์ค๋ ๋น์ ์๋ฏธํ๋ค.
- ์ด ๋น์ ์ ๋ฐ์ ์ผ๋ก ์ฝํ๋ฉฐ, ๋ชจ๋ ๋ฐฉํฅ์์ ๊ท ์ผํ๊ฒ ๋ฌผ์ฒด์ ๋๋ฌํ๋ค.
- ์ฃผ๋ณ๊ด์ 3D ์ฅ๋ฉด์ ์ ๋ฐ์ ์ธ ๋ฐ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํค๋ฉฐ, ๊ทธ๋ฆผ์๊ฐ ๋๋ฌด ์ด๋ก๊ฒ ๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ ์ค๋ค.
- ์๋ฅผ ๋ค์ด, ํ๋ฆฐ ๋ ์จ์์๋ ์ง์ ์ ์ธ ํ๋น์ ์์ง๋ง, ์ฃผ๋ณ๊ด์ผ๋ก ์ธํด ๋ฌผ์ฒด๊ฐ ์์ ํ ์ด๋ก์ง ์๊ฒ ๋ณด์ธ๋ค.
- Specular Light (๋ฐ์ฌ๊ด):
- ๋ฐ์ฌ๊ด์ ๋ฌผ์ฒด์ ํน์ ๋ถ๋ถ์์ ๋น์ด ๋ฐ์ฌ๋์ด ์๊ธฐ๋ ๋ฐ์ ํ์ด๋ผ์ดํธ๋ฅผ ๋ํ๋ธ๋ค.
- ์ด๋ ๋ฌผ์ฒด์ ๊ดํ์ด๋ ๋ฐ์ง๊ฑฐ๋ฆผ์ ํํํ๋ฉฐ, ๋ฌผ์ฒด๊ฐ ๋งค๋๋ฝ๊ณ ๊ดํ์ด ์๋ ์ ๋๋ฅผ ๋ํ๋ธ๋ค.
- ๋ฐ์ฌ๊ด์ ๋น์ด ๋ฌผ์ฒด์ ๋งค์ฐ ์ง์ ์ ์ผ๋ก ๋ฟ์์ ๋ ๊ฐ์ฅ ๊ฐํ๊ฒ ๋ํ๋๋ฉฐ, ๋ฌผ์ฒด์ ์ฌ์ง์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ํํ๋๋ค.
- ์๋ฅผ ๋ค์ด, ๊ดํ์ด ๋๋ ๊ธ์์ด๋ ๋ฌผ์ ํ๋ฉด์์ ๋ณผ ์ ์๋ ๊ฐํ ํ์ด๋ผ์ดํธ๊ฐ ์ด์ ํด๋นํ๋ค.
- ๊ทธ๋ฆผ์์ ๊ธฐ๋ณธ ๊ฐ๋ :
- ๊ทธ๋ฆผ์๋ ๋ฌผ์ฒด๊ฐ ๋น์ ์ํฅ์ ๋ฐ์ ์์ฑ๋๋ ์ด๋์ด ์์ญ์ด๋ค.
- Babylon.js์์๋
directional
,spot
,point
๋ฑ์ ๋น(Light) ์ข ๋ฅ์ ๋ฐ๋ผ ๊ทธ๋ฆผ์๊ฐ ์์ฑ๋๋ค. - ๊ทธ๋ฆผ์๋ ๋น์ ๋ฐฉํฅ, ๊ฐ๋ ๋ฐ ๋ฌผ์ฒด์ ํํ์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ๋ํ๋๋ค.
- ShadowGenerator:
ShadowGenerator
๋ ๊ทธ๋ฆผ์๋ฅผ ์์ฑํ๊ธฐ ์ํ ๊ฐ์ฒด์ด๋ค.- ์์ฑ์๋ ๊ทธ๋ฆผ์์ ํด์๋์ ๊ทธ๋ฆผ์๋ฅผ ์์ฑํ๋ ๋น์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋๋ค.
- ์์:
var shadowGenerator = new BABYLON.ShadowGenerator(1024, dirLight); shadowGenerator.addShadowCaster(box); // box๊ฐ ๊ทธ๋ฆผ์๋ฅผ ์์ฑํ๋๋ก ์ค์ shadowGenerator.useExponentialShadowMap = true; ground.receiveShadows = true; // ๋ ์ด ๊ทธ๋ฆผ์๋ฅผ ๋ฐ๋๋ก ์ค์
- 2-1. useExponentialShadowMap:
useExponentialShadowMap
์์ฑ์ ์ง์ ๊ทธ๋ฆผ์ ๋งต(Exponential Shadow Map)์ ์ฌ์ฉํ๋๋ก ์ค์ ํ๋ค.- ์ด ๋ฐฉ๋ฒ์ ๋น๊ณผ ๋ฉ์ด์ง์๋ก ๊ทธ๋ฆผ์๊ฐ ๋ถ๋๋ฝ๊ฒ ํผ์ง๋ ํจ๊ณผ๋ฅผ ์์ฑํ๋ค.
- ๊ทธ๋ฆผ์์ ํ์ค๊ฐ์ ๋์ด๋ ๋ฐ ์ ์ฉํ๋ค.
- 2-1. useExponentialShadowMap:
- ๊ทธ๋ฆผ์์ ๋ค์ํ ํํฐ๋ง ๊ธฐ์ :
- Babylon.js๋ ๋ค์ํ ๊ทธ๋ฆผ์ ํํฐ๋ง ๊ธฐ์ ์ ์ ๊ณตํ๋ค:
- PCF (Percentage-Closer Filtering): ๊ทธ๋ฆผ์ ๊ฒฝ๊ณ๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฒ.
- PCSS (Percentage-Closer Soft Shadows): ๊ทธ๋ฆผ์์ ๊ฒฝ๊ณ๋ฅผ ๋์ฑ ํ์ค์ ์ผ๋ก ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌ.
- Poisson Sampling: ๊ทธ๋ฆผ์์ ๊ฒฝ๊ณ์ ๋๋ค์ฑ์ ์ถ๊ฐํ์ฌ ๋ถ๋๋ฌ์ด ํจ๊ณผ ์์ฑ.
- Exponential Shadow Map: ๋น๊ณผ์ ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ ๊ทธ๋ฆผ์ ๊ฐ๋๊ฐ ์ง์์ ์ผ๋ก ๋ณํ.
- Blurred Exponential: ๋ ๋ถ๋๋ฌ์ด ๊ทธ๋ฆผ์ ๊ฒฝ๊ณ๋ฅผ ์ํด ์ง์ ๊ทธ๋ฆผ์ ๋งต์ ํ๋ฆผ ์ฒ๋ฆฌ.
- Close Exponential: ๋ฌผ์ฒด์ ๊ฐ๊น์ด ๋ถ๋ถ์ ๊ทธ๋ฆผ์๋ฅผ ๋ ์ ๋ช ํ๊ฒ ํํ.
antialias ์ต์ ์ MSAA(Multisample Anti-Aliasing)๋ฅผ ์บ๋ฒ์ค์ ์ ์ฉํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ๊ธฐ๋ฅ์ด๋ค. MSAA๋ ๊ทธ๋ํฝ ๋ ๋๋ง ๊ณผ์ ์์ ๊ฐ์ฒด์ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํ์ฌ, ๊ณ๋จ ํ์(jaggies)์ ๊ฐ์์ํค๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ๋ฐฉ๋ฒ์ ๊ฐ ํฝ์ ์ฃผ๋ณ์ ์ฌ๋ฌ ์ํ์ ์ทจํ์ฌ ํ๊ท ์์ ๊ณ์ฐํจ์ผ๋ก์จ ๊ฐ์ฅ์๋ฆฌ๋ฅผ ๋ ๋งค๋๋ฝ๊ฒ ๋ง๋ ๋ค. ์ด๋ฐ ์ฒ๋ฆฌ๋ 3D ๊ทธ๋ํฝ์ค์์ ํนํ ์ค์ํ๋ฉฐ, ๋ ๋์ ํ์ง์ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๋ค. Antialias ์ต์ ์ ํ์ฑํํ๋ฉด ์ด๋ฏธ์ง์ ์ ๋ฐ์ ์ธ ์๊ฐ์ ํ์ง์ด ํฅ์๋์ง๋ง, ๊ทธ๋งํผ ๊ทธ๋ํฝ ์ฒ๋ฆฌ์ ๋ ๋ง์ ์์์ด ์๋ชจ๋ ์ ์๋ค.
React ์ปดํฌ๋ํธ์์ BabylonJS์ antialias ์ต์
์ ์ถ๊ฐํ๋ ค๋ฉด, Engine
๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ antialias ์ต์
์ ํ์ฑํํด์ผ ํ๋ค. Engine
์์ฑ์๋ antialias๋ฅผ ํ์ฑํํ ์ ์๋ ์ต์
์ ์ ๊ณตํ๋ค.
const engine = new Engine(canvas, true); // antialias๋ฅผ ํ์ฑํ
์์ ์ฝ๋์์ true
๊ฐ์ antialias๋ฅผ ํ์ฑํํ๊ฒ ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ์ด ๋ณ๊ฒฝ์ ํตํด ์์ฑ๋๋ 3D ๊ทธ๋ํฝ์ค์ ๊ฐ์ฅ์๋ฆฌ๊ฐ ๋ ๋ถ๋๋ฌ์์ง ๊ฒ์ด๋ค.
- Material์ ์ ์:
- Material์ 3D ๊ฐ์ฒด์ ํ๋ฉด ํน์ฑ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ์ด๋ ๊ฐ์ฒด์ ์์, ์ง๊ฐ, ๊ดํ ๋ฑ์ ๊ฒฐ์ ํ๋ค.
- StandardMaterial:
StandardMaterial
์ ๊ธฐ๋ณธ์ ์ธ Material ์ ํ์ด๋ค.- ์ด๋ ๊ฐ์ฒด์ ์์๊ณผ ์ง๊ฐ ๋ฑ ๊ธฐ๋ณธ์ ์ธ ์๊ฐ์ ํน์ฑ์ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- ์์:
var stdMat = new BABYLON.StandardMaterial("stdMat", scene); stdMat.diffuseColor = BABYLON.Color3.Random(); // ์์ ๋ณ๊ฒฝ sphere.material = stdMat; // sphere์ material ์ ์ฉ
- 2-1. diffuseColor์ ์ญํ :
diffuseColor
๋ Material์ ๊ธฐ๋ณธ ์์์ ์ค์ ํ๋ค.- ์ด๋ ๋น์ ์ํด ์ง์ ์ ์ผ๋ก ๋ฐ์ฌ๋๋ ์์ ๋ํ๋ธ๋ค.
BABYLON.Color3
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌด์์ ์์์ ์์ฑํ ์ ์๋ค.
- 2-1. diffuseColor์ ์ญํ :
- PBRMaterial:
PBRMaterial
์ ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ๋ ๋๋ง(Pysically Based Rendering) Material์ด๋ค.- ์ด๋ ๋ฌผ์ฒด์ ํ๋ฉด์ด ์ค์ ์ธ๊ณ์ ๋ฌผ๋ฆฌ ๋ฒ์น์ ๋ฐ๋ผ ๋น์ ๋ฐ์ฌํ๊ณ ํก์ํ๋ ๋ฐฉ์์ ๋ชจ๋ฐฉํ๋ค.
- ์์:
var pbrMat = new BABYLON.PBRMaterial("pbrMat", scene); pbrMat.albedoColor = BABYLON.Color3.Yellow(); // ์์ ๋ณ๊ฒฝ pbrMat.metallic = 0; // metallic ์ค์ var tex = new BABYLON.Texture("textures/crate.png", scene); // ํ ์ค์ฒ ๋ถ๋ฌ์ด pbrMat.albedoTexture = tex; // pbrMat์ ํ ์ค์ฒ ์ ์ฉ box.material = pbrMat; // box์ material ์ ์ฉ
- 3-1. albedoColor์ albedoTexture์ ์ญํ :
albedoColor
๋ PBRMaterial์ ๊ธฐ๋ณธ ์์์ ์ค์ ํ๋ค.albedoTexture
๋ Material์ ์ ์ฉํ ํ ์ค์ฒ๋ฅผ ์ ์ํ๋ค.- ์ด๋ค์ ๋ฌผ์ฒด์ ์๊ณผ ์ง๊ฐ์ ๋์ฑ ์ฌ์ค์ ์ผ๋ก ํํํ๋ ๋ฐ ๊ธฐ์ฌํ๋ค.
- 3-2. metallic์ ์๋ฏธ์ ์ฌ์ฉ:
metallic
์์ฑ์ Material์ด ๊ธ์์ฑ์ ์ผ๋ง๋ ๊ฐ์ง๊ณ ์๋์ง ์ ์ํ๋ค.- ๊ฐ์ด 0์ด๋ฉด ๋น๊ธ์์ฑ, 1์ ๊ฐ๊น์ฐ๋ฉด ๊ธ์์ฑ์ ๋ํ๋ธ๋ค.
- ๊ธฐ๋ณธ๊ฐ์ 0์ด์ง๋ง, ์ค์ ํ์ง ์์ผ๋ฉด Material์ด ๊น๋งฃ๊ฒ ๋ณด์ผ ์ ์๋ค.
- 3-1. albedoColor์ albedoTexture์ ์ญํ :
- ShaderMaterial:
ShaderMaterial
์ ์ฌ์ฉ์ ์ ์ ์ ฐ์ด๋๋ฅผ ์ ์ฉํ ์ ์๋ Material์ด๋ค.- ์ด๋ฅผ ํตํด ๊ณ ์ ํ ๋ ๋๋ง ํจ๊ณผ๋ฅผ ์์ฑํ ์ ์๋ค.
- ์ฌ์ฉ์๊ฐ ์ง์ ์์ฑํ ์ ฐ์ด๋ ์ฝ๋๋ฅผ ํตํด ๋ณต์กํ ์๊ฐ์ ํจ๊ณผ๋ฅผ ๊ตฌํํ๋ค.
- ์์:
var shaderMaterial = new BABYLON.ShaderMaterial("shader", scene, { vertex: "custom", fragment: "custom", }, { attributes: ["position", "normal", "uv"], uniforms: ["world", "worldView", "worldViewProjection", "view", "projection"] });
- GroundMaterial:
- GroundMaterial์ ์ง๋ฉด์ด๋ ๋ฐ๋ฅ์ ์ฌ์ฉ๋๋ ํน๋ณํ ํํ์ Material์ด๋ค.
- ์ด๋ ์ฃผ๋ก ์งํ์ด๋ ํ๊ฒฝ์ ๋ฐ๋ฅ์ ํํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
diffuseTexture
์์ฑ์ ์ฌ์ฉํ์ฌ ์ง๋ฉด์ ์ง๊ฐ์ ์ค์ ํ๋ค.- ์์:
var groundMaterial = new BABYLON.StandardMaterial("ground", scene); groundMaterial.diffuseTexture = new BABYLON.Texture("textures/ground.jpg", scene); groundMaterial.diffuseTexture.uScale = 6; // uํฌ๊ธฐ ์ค์ (์ด๋ฏธ์ง ๊ฐ๋ก ํฌ๊ธฐ) groundMaterial.diffuseTexture.vScale = 6; // vํฌ๊ธฐ ์ค์ (์ด๋ฏธ์ง ์ธ๋ก ํฌ๊ธฐ) groundMaterial.specularColor = new BABYLON.Color3(0, 0, 0); // specular์์ ๋ณ๊ฒฝ ground.material = groundMaterial; // ground์ material ์ ์ฉ
-
5-1. uScale๊ณผ vScale์ ์ญํ :
uScale
๊ณผvScale
์ ํ ์ค์ฒ ๋งคํ์์ ์ฌ์ฉ๋๋ค.uScale
์ ํ ์ค์ฒ์ ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ค.vScale
์ ํ ์ค์ฒ์ ์ธ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ๋ค.- ์ด๋ฅผ ํตํด ํ ์ค์ฒ๊ฐ 3D ๊ฐ์ฒด์ ์ ์ฉ๋๋ ๋ฐฉ์์ ์ ์ดํ๋ค.
-
5-2. specularColor์ ๊ธฐ๋ฅ:
specularColor
๋ Material์ ๊ดํ ์์์ ์ ์ํ๋ค.- ์ด๋ ๋ฌผ์ฒด๊ฐ ๋น์ ๋ฐ์ฌํ ๋ ๋ํ๋๋ ํ์ด๋ผ์ดํธ์ ์์ ๊ฒฐ์ ํ๋ค.
- ๊ดํ ์์์ ์กฐ์ ํ์ฌ ๋ฌผ์ฒด์ ๋ฌผ์ง๊ฐ๊ณผ ๊ดํ๋๋ฅผ ์ ์ดํ ์ ์๋ค.
-
- ์ค์๊ฐ์ผ๋ก ์ฌ์ ๊ตฌ์กฐ์ ์์ฑ์ ๋ณผ ์ ์์ด ๋๋ฒ๊น ๊ณผ ๊ฐ๋ฐ ๊ณผ์ ์ ๊ฐ์ํํ๋ค.
- ์ค๋ธ์ ํธ, ๋ผ์ดํธ, ์นด๋ฉ๋ผ, ๋ฌผ๋ฆฌ ์์ง ์ค์ ๋ฑ์ ์๊ฐ์ ์ผ๋ก ์กฐ์ ํ ์ ์๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง ๊ธฐ๋ฅ์ ํตํด ํ๋ ์ ๋ ์ดํธ์ ์์ ์ฌ์ฉ๋์ ํ์ธํ ์ ์๋ค.
yarn add @babylonjs/inspector
Inspector.Show(scene, userOptions) // Inspector ์ด๊ธฐ
Inspector.Hide()
Inspector.IsVisible
Inspector๋ฅผ importํ ๋ค์ Inspector ๊ฐ์ฒด ๋ด์ ๋ฉ์๋๋ฅผ ํ์ฉํด Inspector๋ฅผ ์ด๊ณ ๋ซ์ ์ ์๋ค.