My Babylonjs Practice with React, TypeScript ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป

Table of Contents


Canvas, Engine, Scene, Camera

Babylon.js์—์„œ 3D ๊ทธ๋ž˜ํ”ฝ์Šค๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ์š”์†Œ๋“ค์ด๋‹ค.

  1. Canvas:
  • Canvas๋Š” ์›น ํŽ˜์ด์ง€์— ๊ทธ๋ž˜ํ”ฝ์„ ๊ทธ๋ฆฌ๊ธฐ ์œ„ํ•œ HTML ์š”์†Œ์ด๋‹ค. WebGL๊ณผ Babylon.js๋Š” ์ด Canvas ์œ„์—์„œ ๊ทธ๋ž˜ํ”ฝ์Šค๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค.
  • Canvas๋Š” 2D ๋ฐ 3D ๊ทธ๋ž˜ํ”ฝ์Šค๋ฅผ ์œ„ํ•œ ๊ทธ๋ฆฌ๊ธฐ ์˜์—ญ์„ ์ œ๊ณตํ•˜๋ฉฐ, JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. Engine:
  • Engine์€ Babylon.js์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ๋กœ, WebGL ๋ Œ๋”๋ง ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด๋Š” 3D ๊ทธ๋ž˜ํ”ฝ์Šค๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•œ ๋ชจ๋“  ๊ธฐ๋ณธ์ ์ธ ์„ค์ •๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
  • Engine์€ Canvas์™€ ์—ฐ๋™๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋ Œ๋”๋ง ๋ฃจํ”„์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ 3D ๊ทธ๋ž˜ํ”ฝ์Šค๋ฅผ ํ™”๋ฉด์— ํ‘œ์‹œํ•œ๋‹ค.

  1. Scene:
  • Scene์€ 3D ๊ทธ๋ž˜ํ”ฝ์Šค๊ฐ€ ๋ Œ๋”๋ง๋˜๋Š” ํ™˜๊ฒฝ์ด๋‹ค. ์ด๋Š” ๋ชจ๋“  3D ๊ฐ์ฒด, ์นด๋ฉ”๋ผ, ๋ผ์ดํŠธ, ๋ฌผ๋ฆฌ์  ํŠน์„ฑ ๋“ฑ์„ ํฌํ•จํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋‹ค.
  • Scene์€ ๊ฐ€์ƒ์˜ 3D ์„ธ๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” 3D ํ™˜๊ฒฝ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.

  1. Camera:
  • Camera๋Š” 3D Scene์—์„œ์˜ ๊ด€์ ์„ ์ •์˜ํ•œ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž๊ฐ€ 3D ๊ณต๊ฐ„์„ ์–ด๋–ป๊ฒŒ ๋ณด๊ณ  ์ธ์‹ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.
  • Babylon.js์—์„œ ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ์นด๋ฉ”๋ผ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋“ค์€ ํšŒ์ „, ์คŒ, ์ด๋™ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ Scene์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.


Math.PI์™€ ๋ผ๋””์•ˆ์˜ ๊ฐœ๋…

  1. ๋ผ๋””์•ˆ์˜ ์ •์˜์™€ ์ค‘์š”์„ฑ:
  • ๋ผ๋””์•ˆ์€ ๊ฐ๋„๋ฅผ ์ธก์ •ํ•˜๋Š” ๋‹จ์œ„์ด๋‹ค.
  • ์›์˜ ์ค‘์‹ฌ์—์„œ ๋ฐ˜์ง€๋ฆ„ ๊ธธ์ด๋งŒํผ ์›์˜ ๋‘˜๋ ˆ๋ฅผ ๋”ฐ๋ผ ์ด๋™ํ–ˆ์„ ๋•Œ์˜ ๊ฐ์ด 1 ๋ผ๋””์•ˆ์ด๋‹ค.
  • 360๋„๋Š” ์•ฝ 2ฯ€ ๋ผ๋””์•ˆ๊ณผ ๊ฐ™์œผ๋ฉฐ, ์ด๋Š” ์› ํ•œ ๋ฐ”ํ€ด๋ฅผ ๋„๋Š” ๊ฐ๋„์ด๋‹ค.
  • ๋ผ๋””์•ˆ์€ ์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ์Šค์™€ ์ˆ˜ํ•™ ๊ณ„์‚ฐ์—์„œ ํšจ์œจ์ ์ด๊ณ  ํ‘œ์ค€ํ™”๋œ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค.

  1. Math.PI์˜ ์—ญํ• ๊ณผ ์‚ฌ์šฉ:
  • Math.PI๋Š” ์›์ฃผ์œจ ฯ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜์ด๋‹ค.
  • ๊ฐ๋„๋ฅผ ๋ผ๋””์•ˆ์œผ๋กœ ํ‘œํ˜„ํ•  ๋•Œ Math.PI๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ์ฒด๋ฅผ 180๋„ ํšŒ์ „์‹œํ‚ค๋ ค๋ฉด Math.PI (ฯ€ ๋ผ๋””์•ˆ)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • Math.PI๋Š” ์ง์ ‘์ ์ธ ๋ผ๋””์•ˆ ๊ณ„์‚ฐ์— ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋„ ํšŒ์ „์— ์ ํ•ฉํ•˜๋‹ค.

  1. BABYLON.Tools.ToRadians์˜ ์‚ฌ์šฉ๊ณผ ๋ฉ”์ปค๋‹ˆ์ฆ˜:
  • BABYLON.Tools.ToRadians ํ•จ์ˆ˜๋Š” ๋„ ๋‹จ์œ„์˜ ๊ฐ๋„๋ฅผ ๋ผ๋””์•ˆ์œผ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ๋„ / 180 * Math.PI๋ผ๋Š” ๊ณต์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ด ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋„ ๋‹จ์œ„๋กœ ์ฃผ์–ด์ง„ ๊ฐ๋„๋ฅผ ๋ผ๋””์•ˆ์œผ๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
  • BABYLON.Tools.ToRadians๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๊ฐ๋„๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ์— ์ ํ•ฉํ•˜๋‹ค.

  1. 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

  1. Segments์˜ ์ •์˜์™€ ์‚ฌ์šฉ:
  • segments๋Š” Babylon.js์—์„œ 3D ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฐ์ฒด์˜ ํ‘œ๋ฉด์„ ์ด๋ฃจ๋Š” ์„ธ๋ถ„ํ™”๋œ ๋ถ€๋ถ„์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ๋†’์€ segments ๊ฐ’์€ ๋” ๋งŽ์€ ๋‹ค๊ฐํ˜•์„ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ์ฒด์˜ ํ‘œ๋ฉด์„ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ์ด๋Š” ๊ฐ์ฒด์˜ ๊ณก์„ ์ด๋‚˜ ์›ํ˜• ๋ถ€๋ถ„์ด ๋” ๋ถ€๋“œ๋Ÿฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์ด๊ฒŒ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ segments ๊ฐ’์ด ๋†’์„์ˆ˜๋ก ๋” ๋งŽ์€ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•˜๊ณ , ๊ทธ๋ž˜ํ”ฝ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

  1. 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๊ฐœ์˜ ์„ธ๊ทธ๋จผํŠธ๋กœ ๋‚˜๋ˆ„์–ด ์„ธ๋ฐ€ํ•˜๊ฒŒ ํ‘œํ˜„ํ•œ๋‹ค.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ƒ์„ฑ๋œ ๊ตฌ์ฒด๋Š” ๋” ๋งŽ์€ ๋‹ค๊ฐํ˜•์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์–ด ๋” ๋ถ€๋“œ๋Ÿฌ์šด ๊ณก์„ ์„ ๊ฐ€์ง„๋‹ค.


Shaders

๋ฒ„ํ…์Šค ์…ฐ์ด๋”(Vertex Shader)์™€ ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”(Fragment Shader)๋Š” 3D ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.
์ด๋“ค์€ GPU์˜ ์…ฐ์ด๋” ํŒŒ์ดํ”„๋ผ์ธ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ ์š”์†Œ์ด๋‹ค.

  1. ๋ฒ„ํ…์Šค ์…ฐ์ด๋”:
  • ๋ฒ„ํ…์Šค ์…ฐ์ด๋”๋Š” 3D ๋ชจ๋ธ์˜ ๊ฐ ์ •์ (vertex)์— ๋Œ€ํ•ด ์‹คํ–‰๋œ๋‹ค. ์ด ์…ฐ์ด๋”์˜ ์ฃผ์š” ๋ชฉ์ ์€ ์ •์ ์˜ ์œ„์น˜, ์ƒ‰์ƒ, ์งˆ๊ฐ ์ขŒํ‘œ, ์ •์ ์— ์ ์šฉ๋˜๋Š” ๊ด‘์› ์ •๋ณด ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋ฒ„ํ…์Šค ์…ฐ์ด๋”๋Š” ๋ชจ๋ธ์„ ํ™”๋ฉด์— ํˆฌ์˜ํ•˜๊ธฐ ์ „์— ๋ชจ๋ธ์˜ ์ •์ ์„ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ด๋Š” ์ฃผ๋กœ ์ •์ ์˜ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ๊ด‘์› ํšจ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฉฐ, ์นด๋ฉ”๋ผ ๋ทฐ์— ๋งž๊ฒŒ ์ •์ ์„ ์กฐ์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ๋ฒ„ํ…์Šค ์…ฐ์ด๋”๋Š” ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ฒ˜์Œ์— ์œ„์น˜ํ•˜๋ฉฐ, ๊ฐ ์ •์ ์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์”ฉ ์‹คํ–‰๋œ๋‹ค.

  1. ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”:
  • ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ํ™”๋ฉด์— ๊ทธ๋ ค์งˆ ๊ฐ ํ”ฝ์…€(fragment)์— ๋Œ€ํ•ด ์‹คํ–‰๋œ๋‹ค. ์ด ์…ฐ์ด๋”์˜ ๋ชฉ์ ์€ ํ”ฝ์…€์˜ ์ตœ์ข… ์ƒ‰์ƒ๊ณผ ๋‹ค๋ฅธ ํŠน์„ฑ์„ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ํ…์Šค์ฒ˜ ๋งคํ•‘, ์ƒ‰์ƒ ํ˜ผํ•ฉ, ๊ด‘์› ํšจ๊ณผ ๋“ฑ์„ ๊ณ„์‚ฐํ•˜์—ฌ ๊ฐ ํ”ฝ์…€์— ์ ์šฉํ•œ๋‹ค. ์ด๋Š” ๋ฌผ์ฒด์˜ ํ‘œ๋ฉด ์งˆ๊ฐ๊ณผ ๋น›์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•˜๋‹ค.
  • ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋’ท๋ถ€๋ถ„์— ์œ„์น˜ํ•˜๋ฉฐ, ๋ฒ„ํ…์Šค ์…ฐ์ด๋”์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ๋ Œ๋”๋งํ•  ๊ฐ ํ”ฝ์…€์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ์”ฉ ์‹คํ–‰๋œ๋‹ค.
  • ์ด ์…ฐ์ด๋”๋Š” ํ™”๋ฉด์— ํ‘œ์‹œ๋  ์ตœ์ข… ์ด๋ฏธ์ง€์˜ ํ’ˆ์งˆ๊ณผ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํฌ๊ฒŒ ๊ฒฐ์ •ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ”ฝ์…€๋ณ„ ๊ด‘์› ๊ณ„์‚ฐ, ๊ทธ๋ฆผ์ž ํšจ๊ณผ, ๋ฐ˜์‚ฌ ๋ฐ ๊ด‘ํƒ ํšจ๊ณผ ๋“ฑ์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

  1. ๋ฒ„ํ…์Šค ์…ฐ์ด๋”์™€ ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”์˜ ์ƒํ˜ธ์ž‘์šฉ:
  • ๋ฒ„ํ…์Šค ์…ฐ์ด๋”๋Š” ๋จผ์ € ์‹คํ–‰๋˜์–ด ๊ฐ ์ •์ ์˜ ์œ„์น˜์™€ ์†์„ฑ์„ ๊ฒฐ์ •ํ•œ๋‹ค. ์ดํ›„ ์ด ๋ฐ์ดํ„ฐ๋Š” ๋ž˜์Šคํ„ฐํ™” ๊ณผ์ •์„ ๊ฑฐ์ณ ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  • ํ”„๋ž˜๊ทธ๋จผํŠธ ์…ฐ์ด๋”๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ํ”ฝ์…€์˜ ์ตœ์ข… ์ƒ‰์ƒ๊ณผ ํ…์Šค์ฒ˜๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ์ด ๊ณผ์ •์—์„œ ๋ฒ„ํ…์Šค ์…ฐ์ด๋”๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›์€ ์ •๋ณด์™€ ํ…์Šค์ฒ˜, ๋ผ์ดํŒ… ์ •๋ณด ๋“ฑ์„ ๊ฒฐํ•ฉํ•˜์—ฌ ํ”ฝ์…€๋ณ„๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
  • ์ด ๋‘ ์…ฐ์ด๋”์˜ ์กฐํ•ฉ์€ 3D ๊ทธ๋ž˜ํ”ฝ์Šค์—์„œ ๋ฌผ์ฒด์˜ ํ˜•ํƒœ, ์ƒ‰์ƒ, ์กฐ๋ช…, ์งˆ๊ฐ ๋“ฑ์„ ์ •๊ตํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ด๋‹ค. ์ด๋“ค์€ GPU์˜ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ํ™œ์šฉํ•˜์—ฌ ๊ณ ์„ฑ๋Šฅ ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.


Colors

BabylonJS์—์„œ ์‚ฌ์šฉ๋˜๋Š” 'Diffuse Color', 'Ambient Color', ๊ทธ๋ฆฌ๊ณ  'Specular Color'๋Š” 3D ๋ชจ๋ธ๋ง์—์„œ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•˜๋Š” ์žฌ์งˆ์˜ ์†์„ฑ๋“ค์ด๋‹ค.

  1. Diffuse Color (ํ™•์‚ฐ ์ƒ‰์ƒ):
  • ์ด ์†์„ฑ์€ ๋ฌผ์ฒด์˜ ๊ธฐ๋ณธ ์ƒ‰์ƒ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฌผ์ฒด์— ๋น›์ด ๋‹ฟ์•˜์„ ๋•Œ, ๊ทธ ๋น›์ด ์–ด๋–ป๊ฒŒ ํ‘œ๋ฉด์—์„œ ๋ฐ˜์‚ฌ๋˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ํ™•์‚ฐ ์ƒ‰์ƒ์€ ๋ฌผ์ฒด์˜ ํ‘œ๋ฉด์—์„œ ๊ณ ๋ฅด๊ฒŒ ํผ์ ธ ๋‚˜๊ฐ€๋Š” ๋น›์˜ ์ƒ‰์ƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋นจ๊ฐ„ ์‚ฌ๊ณผ์˜ ๊ฒฝ์šฐ, ํ™•์‚ฐ ์ƒ‰์ƒ์€ '๋นจ๊ฐ•'์ผ ๊ฒƒ์ด๋‹ค.
  1. Ambient Color (์ฃผ๋ณ€๊ด‘ ์ƒ‰์ƒ):
  • ์ด๋Š” ๋ฌผ์ฒด๊ฐ€ ๋ฐ›๋Š” ๊ฐ„์ ‘๊ด‘์˜ ์ƒ‰์ƒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์ฃผ๋ณ€๊ด‘์€ ์ฃผ๋ณ€ ํ™˜๊ฒฝ์—์„œ ๋ฐ˜์‚ฌ๋˜์–ด ์˜ค๋Š” ๋น›์œผ๋กœ, ์ง์ ‘์ ์ธ ๊ด‘์›์ด ์•„๋‹Œ ์ฃผ๋ณ€์˜ ๋น›์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ฃผ๋ณ€๊ด‘ ์ƒ‰์ƒ์€ ์ฃผ๋กœ ๋ฌผ์ฒด๊ฐ€ ์–ด๋–ค ์ƒ‰์ƒ์˜ ๋น›์„ ๊ฐ„์ ‘์ ์œผ๋กœ ๋ฐ˜์‚ฌํ•˜๋Š”์ง€๋ฅผ ์ •์˜ํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ‘ธ๋ฅธ์ƒ‰์˜ ๋ฐฉ์—์„œ ๋ฌผ์ฒด๋Š” ํ‘ธ๋ฅธ์ƒ‰์˜ ์ฃผ๋ณ€๊ด‘์„ ๋ฐ›์„ ๊ฒƒ์ด๋‹ค.
  1. Specular Color (๋ฐ˜์‚ฌ ์ƒ‰์ƒ):
  • ์ด ์†์„ฑ์€ ๋ฌผ์ฒด์˜ ๊ด‘ํƒ ๋˜๋Š” ๋ฐ˜์‚ฌํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ๋น›์ด ๋ฌผ์ฒด์˜ ํŠน์ • ๋ถ€๋ถ„์— ์ง์ ‘ ๋‹ฟ์•„ ๋ฐ˜์‚ฌ๋  ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฐ•๋ ฌํ•œ ํ•˜์ด๋ผ์ดํŠธ์˜ ์ƒ‰์ƒ์ด๋‹ค.
  • ๋ฐ˜์‚ฌ ์ƒ‰์ƒ์€ ๋ฌผ์ฒด๊ฐ€ ๋น›๋‚˜๋Š” ์ •๋„์™€ ๊ทธ ๋น›์˜ ์ƒ‰์ƒ์„ ๊ฒฐ์ •ํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ˜์งˆ๋ฐ˜์งˆํ•œ ๊ธˆ์† ํ‘œ๋ฉด์€ ๊ฐ•ํ•œ ๋ฐ˜์‚ฌ ์ƒ‰์ƒ์„ ๊ฐ€์งˆ ๊ฒƒ์ด๋‹ค.


Lights

BabylonJS์™€ ๊ฐ™์€ 3D ๊ทธ๋ž˜ํ”ฝ ํ™˜๊ฒฝ์—์„œ 'Diffuse Light', 'Ambient Light', ๊ทธ๋ฆฌ๊ณ  'Specular Light'๋Š” ์กฐ๋ช…์˜ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ์†์„ฑ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋“ค ๊ฐ๊ฐ์€ ๋ฌผ์ฒด๊ฐ€ ๋น›์„ ์–ด๋–ป๊ฒŒ ๋ฐ›๊ณ  ๋ฐ˜์‚ฌํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ธก๋ฉด์„ ๊ฐ•์กฐํ•œ๋‹ค:

  1. Diffuse Light (ํ™•์‚ฐ๊ด‘):
  • ํ™•์‚ฐ๊ด‘์€ ๋ฌผ์ฒด์˜ ํ‘œ๋ฉด์— ๊ณ ๋ฅด๊ฒŒ ํผ์ง€๋Š” ๋น›์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ด๋Š” ๋ฌผ์ฒด์˜ ๊ธฐ๋ณธ ์ƒ‰์ƒ์„ ๊ฒฐ์ •ํ•˜๋ฉฐ, ๋ฌผ์ฒด์— ๋น›์ด ๋‹ฟ์œผ๋ฉด ๊ทธ ๋น›์ด ์—ฌ๋Ÿฌ ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ๋˜์–ด ๋ถ€๋“œ๋Ÿฌ์šด ๊ทธ๋ฆผ์ž๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ํ™•์‚ฐ๊ด‘์€ ๋ฌผ์ฒด์˜ ํ˜•ํƒœ์™€ ์งˆ๊ฐ์„ ์ž˜ ๋“œ๋Ÿฌ๋‚ด์ฃผ์–ด, ๋ฌผ์ฒด๊ฐ€ ๋น›์„ ๋ฐ›๋Š” ๋ฐฉ์‹์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ง‘์€ ๋‚  ํ–‡๋น›์„ ๋ฐ›๋Š” ๋ฌผ์ฒด๋Š” ์ฃผ๋ณ€๋ณด๋‹ค ๋ฐ๊ฒŒ ๋ณด์ด๋ฉฐ, ๊ทธ๋ฆผ์ž๊ฐ€ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํผ์ง„๋‹ค.
  1. Ambient Light (์ฃผ๋ณ€๊ด‘):
  • ์ฃผ๋ณ€๊ด‘์€ ์ง์ ‘์ ์ธ ๊ด‘์›์œผ๋กœ๋ถ€ํ„ฐ ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ฃผ๋ณ€ ํ™˜๊ฒฝ์—์„œ ๋ฐ˜์‚ฌ๋˜์–ด ์˜ค๋Š” ๋น›์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ด ๋น›์€ ์ „๋ฐ˜์ ์œผ๋กœ ์•ฝํ•˜๋ฉฐ, ๋ชจ๋“  ๋ฐฉํ–ฅ์—์„œ ๊ท ์ผํ•˜๊ฒŒ ๋ฌผ์ฒด์— ๋„๋‹ฌํ•œ๋‹ค.
  • ์ฃผ๋ณ€๊ด‘์€ 3D ์žฅ๋ฉด์˜ ์ „๋ฐ˜์ ์ธ ๋ฐ๊ธฐ๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ, ๊ทธ๋ฆผ์ž๊ฐ€ ๋„ˆ๋ฌด ์–ด๋‘ก๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค€๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ํ๋ฆฐ ๋‚ ์”จ์—์„œ๋Š” ์ง์ ‘์ ์ธ ํ–‡๋น›์€ ์—†์ง€๋งŒ, ์ฃผ๋ณ€๊ด‘์œผ๋กœ ์ธํ•ด ๋ฌผ์ฒด๊ฐ€ ์™„์ „ํžˆ ์–ด๋‘ก์ง€ ์•Š๊ฒŒ ๋ณด์ธ๋‹ค.
  1. Specular Light (๋ฐ˜์‚ฌ๊ด‘):
  • ๋ฐ˜์‚ฌ๊ด‘์€ ๋ฌผ์ฒด์˜ ํŠน์ • ๋ถ€๋ถ„์—์„œ ๋น›์ด ๋ฐ˜์‚ฌ๋˜์–ด ์ƒ๊ธฐ๋Š” ๋ฐ์€ ํ•˜์ด๋ผ์ดํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ์ด๋Š” ๋ฌผ์ฒด์˜ ๊ด‘ํƒ์ด๋‚˜ ๋ฐ˜์งˆ๊ฑฐ๋ฆผ์„ ํ‘œํ˜„ํ•˜๋ฉฐ, ๋ฌผ์ฒด๊ฐ€ ๋งค๋„๋Ÿฝ๊ณ  ๊ด‘ํƒ์ด ์žˆ๋Š” ์ •๋„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • ๋ฐ˜์‚ฌ๊ด‘์€ ๋น›์ด ๋ฌผ์ฒด์— ๋งค์šฐ ์ง์ ‘์ ์œผ๋กœ ๋‹ฟ์•˜์„ ๋•Œ ๊ฐ€์žฅ ๊ฐ•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๋ฉฐ, ๋ฌผ์ฒด์˜ ์žฌ์งˆ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„๋œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ด‘ํƒ์ด ๋‚˜๋Š” ๊ธˆ์†์ด๋‚˜ ๋ฌผ์˜ ํ‘œ๋ฉด์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฐ•ํ•œ ํ•˜์ด๋ผ์ดํŠธ๊ฐ€ ์ด์— ํ•ด๋‹นํ•œ๋‹ค.


Shadow

  1. ๊ทธ๋ฆผ์ž์˜ ๊ธฐ๋ณธ ๊ฐœ๋…:
  • ๊ทธ๋ฆผ์ž๋Š” ๋ฌผ์ฒด๊ฐ€ ๋น›์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์ƒ์„ฑ๋˜๋Š” ์–ด๋‘์šด ์˜์—ญ์ด๋‹ค.
  • Babylon.js์—์„œ๋Š” directional, spot, point ๋“ฑ์˜ ๋น›(Light) ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๊ทธ๋ฆผ์ž๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.
  • ๊ทธ๋ฆผ์ž๋Š” ๋น›์˜ ๋ฐฉํ–ฅ, ๊ฐ•๋„ ๋ฐ ๋ฌผ์ฒด์˜ ํ˜•ํƒœ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ๋‚˜ํƒ€๋‚œ๋‹ค.

  1. 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)์„ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.
      • ์ด ๋ฐฉ๋ฒ•์€ ๋น›๊ณผ ๋ฉ€์–ด์งˆ์ˆ˜๋ก ๊ทธ๋ฆผ์ž๊ฐ€ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํผ์ง€๋Š” ํšจ๊ณผ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
      • ๊ทธ๋ฆผ์ž์˜ ํ˜„์‹ค๊ฐ์„ ๋†’์ด๋Š” ๋ฐ ์œ ์šฉํ•˜๋‹ค.

  1. ๊ทธ๋ฆผ์ž์˜ ๋‹ค์–‘ํ•œ ํ•„ํ„ฐ๋ง ๊ธฐ์ˆ :
  • Babylon.js๋Š” ๋‹ค์–‘ํ•œ ๊ทธ๋ฆผ์ž ํ•„ํ„ฐ๋ง ๊ธฐ์ˆ ์„ ์ œ๊ณตํ•œ๋‹ค:
    • PCF (Percentage-Closer Filtering): ๊ทธ๋ฆผ์ž ๊ฒฝ๊ณ„๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋ฒ•.
    • PCSS (Percentage-Closer Soft Shadows): ๊ทธ๋ฆผ์ž์˜ ๊ฒฝ๊ณ„๋ฅผ ๋”์šฑ ํ˜„์‹ค์ ์œผ๋กœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌ.
    • Poisson Sampling: ๊ทธ๋ฆผ์ž์˜ ๊ฒฝ๊ณ„์— ๋žœ๋ค์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ถ€๋“œ๋Ÿฌ์šด ํšจ๊ณผ ์ƒ์„ฑ.
    • Exponential Shadow Map: ๋น›๊ณผ์˜ ๊ฑฐ๋ฆฌ์— ๋”ฐ๋ผ ๊ทธ๋ฆผ์ž ๊ฐ•๋„๊ฐ€ ์ง€์ˆ˜์ ์œผ๋กœ ๋ณ€ํ™”.
    • Blurred Exponential: ๋” ๋ถ€๋“œ๋Ÿฌ์šด ๊ทธ๋ฆผ์ž ๊ฒฝ๊ณ„๋ฅผ ์œ„ํ•ด ์ง€์ˆ˜ ๊ทธ๋ฆผ์ž ๋งต์„ ํ๋ฆผ ์ฒ˜๋ฆฌ.
    • Close Exponential: ๋ฌผ์ฒด์— ๊ฐ€๊นŒ์šด ๋ถ€๋ถ„์˜ ๊ทธ๋ฆผ์ž๋ฅผ ๋” ์„ ๋ช…ํ•˜๊ฒŒ ํ‘œํ˜„.


Engine Options

antialias

antialias ์˜ต์…˜์€ MSAA(Multisample Anti-Aliasing)๋ฅผ ์บ”๋ฒ„์Šค์— ์ ์šฉํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. MSAA๋Š” ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง ๊ณผ์ •์—์„œ ๊ฐ์ฒด์˜ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌํ•˜์—ฌ, ๊ณ„๋‹จ ํ˜„์ƒ(jaggies)์„ ๊ฐ์†Œ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๊ฐ ํ”ฝ์…€ ์ฃผ๋ณ€์˜ ์—ฌ๋Ÿฌ ์ƒ˜ํ”Œ์„ ์ทจํ•˜์—ฌ ํ‰๊ท  ์ƒ‰์„ ๊ณ„์‚ฐํ•จ์œผ๋กœ์จ ๊ฐ€์žฅ์ž๋ฆฌ๋ฅผ ๋” ๋งค๋„๋Ÿฝ๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ด๋Ÿฐ ์ฒ˜๋ฆฌ๋Š” 3D ๊ทธ๋ž˜ํ”ฝ์Šค์—์„œ ํŠนํžˆ ์ค‘์š”ํ•˜๋ฉฐ, ๋” ๋†’์€ ํ™”์งˆ์˜ ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค. Antialias ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜๋ฉด ์ด๋ฏธ์ง€์˜ ์ „๋ฐ˜์ ์ธ ์‹œ๊ฐ์  ํ’ˆ์งˆ์ด ํ–ฅ์ƒ๋˜์ง€๋งŒ, ๊ทธ๋งŒํผ ๊ทธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ์— ๋” ๋งŽ์€ ์ž์›์ด ์†Œ๋ชจ๋  ์ˆ˜ ์žˆ๋‹ค.

Engine์—์„œ antialias ์˜ต์…˜ ํ™œ์„ฑํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•

React ์ปดํฌ๋„ŒํŠธ์—์„œ BabylonJS์˜ antialias ์˜ต์…˜์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด, Engine ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ antialias ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•œ๋‹ค. Engine ์ƒ์„ฑ์ž๋Š” antialias๋ฅผ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์ œ๊ณตํ•œ๋‹ค.

const engine = new Engine(canvas, true); // antialias๋ฅผ ํ™œ์„ฑํ™”

์œ„์˜ ์ฝ”๋“œ์—์„œ true ๊ฐ’์€ antialias๋ฅผ ํ™œ์„ฑํ™”ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด ๋ณ€๊ฒฝ์„ ํ†ตํ•ด ์ƒ์„ฑ๋˜๋Š” 3D ๊ทธ๋ž˜ํ”ฝ์Šค์˜ ๊ฐ€์žฅ์ž๋ฆฌ๊ฐ€ ๋” ๋ถ€๋“œ๋Ÿฌ์›Œ์งˆ ๊ฒƒ์ด๋‹ค.



Material

  1. Material์˜ ์ •์˜:
  • Material์€ 3D ๊ฐ์ฒด์˜ ํ‘œ๋ฉด ํŠน์„ฑ์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.
  • ์ด๋Š” ๊ฐ์ฒด์˜ ์ƒ‰์ƒ, ์งˆ๊ฐ, ๊ด‘ํƒ ๋“ฑ์„ ๊ฒฐ์ •ํ•œ๋‹ค.

  1. 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 ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌด์ž‘์œ„ ์ƒ‰์ƒ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  1. 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์ด ๊นŒ๋งฃ๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค.

  1. ShaderMaterial:
  • ShaderMaterial์€ ์‚ฌ์šฉ์ž ์ •์˜ ์…ฐ์ด๋”๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Material์ด๋‹ค.
  • ์ด๋ฅผ ํ†ตํ•ด ๊ณ ์œ ํ•œ ๋ Œ๋”๋ง ํšจ๊ณผ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•œ ์…ฐ์ด๋” ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ์‹œ๊ฐ์  ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ์˜ˆ์‹œ:
    var shaderMaterial = new BABYLON.ShaderMaterial("shader", scene, {
        vertex: "custom", 
        fragment: "custom",
    }, {
        attributes: ["position", "normal", "uv"],
        uniforms: ["world", "worldView", "worldViewProjection", "view", "projection"]
    });

  1. 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์˜ ๊ด‘ํƒ ์ƒ‰์ƒ์„ ์ •์˜ํ•œ๋‹ค.
      • ์ด๋Š” ๋ฌผ์ฒด๊ฐ€ ๋น›์„ ๋ฐ˜์‚ฌํ•  ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ํ•˜์ด๋ผ์ดํŠธ์˜ ์ƒ‰์„ ๊ฒฐ์ •ํ•œ๋‹ค.
      • ๊ด‘ํƒ ์ƒ‰์ƒ์„ ์กฐ์ ˆํ•˜์—ฌ ๋ฌผ์ฒด์˜ ๋ฌผ์งˆ๊ฐ๊ณผ ๊ด‘ํƒ๋„๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.


Inspector

Inspector์˜ ํŠน์ง•:

  • ์‹ค์‹œ๊ฐ„์œผ๋กœ ์”ฌ์˜ ๊ตฌ์กฐ์™€ ์†์„ฑ์„ ๋ณผ ์ˆ˜ ์žˆ์–ด ๋””๋ฒ„๊น…๊ณผ ๊ฐœ๋ฐœ ๊ณผ์ •์„ ๊ฐ„์†Œํ™”ํ•œ๋‹ค.
  • ์˜ค๋ธŒ์ ํŠธ, ๋ผ์ดํŠธ, ์นด๋ฉ”๋ผ, ๋ฌผ๋ฆฌ ์—”์ง„ ์„ค์ • ๋“ฑ์„ ์‹œ๊ฐ์ ์œผ๋กœ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ํ”„๋ ˆ์ž„ ๋ ˆ์ดํŠธ์™€ ์ž์› ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•„์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

yarn add @babylonjs/inspector 

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

Inspector.Show(scene, userOptions) // Inspector ์—ด๊ธฐ
Inspector.Hide()
Inspector.IsVisible

Inspector๋ฅผ importํ•œ ๋‹ค์Œ Inspector ๊ฐ์ฒด ๋‚ด์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•ด Inspector๋ฅผ ์—ด๊ณ  ๋‹ซ์„ ์ˆ˜ ์žˆ๋‹ค.