Babylonjs ๋‹ค๋ค„๋ณด๊ธฐ

WebGL Frameworks ๊ฒฝํ—˜ํ•ด๋ณด๊ธฐ

Jun 25, 2022

๊ฐ•์˜๋ฏผ

#JS

๋“ค์–ด๊ฐ€๋ฉฐ

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

WebGL ์ด๋ž€?

WebGL์€ Web Graphics Library์˜ ์•ฝ์ž์ด๋ฉฐ ์›น์—์„œ 2D์™€ 3D ๊ทธ๋ž˜ํ”ฝ์„ ๋ Œ๋”๋งํ•˜๊ธฐ ์œ„ํ•œ ๋กœ์šฐ ๋ ˆ๋ฒจ Javascript API ์ด๋ฉฐ OpenGL ES 2.0์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์— ๋‚ด์žฅ๋œ HTML5 Canvas Element ์œ„์— 2D, 3D ๊ทธ๋ž˜ํ”ฝ์„ ๊ทธ๋ ค์ค๋‹ˆ๋‹ค.
์‚ฌ์‹ค canvas๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ 3D ๊ทธ๋ž˜ํ”ฝ์„ ๋ Œ๋”๋งํ•˜์ง„ ๋ชปํ–ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค ์ฒ˜์Œ์—๋Š” ์ผ๋ถ€ ์œ„์ ฏ๊ณผ ์• ํ”Œ ์šด์˜์ฒด์ œ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ 2D ๊ทธ๋ž˜ํ”ฝ ๋ Œ๋”๋ง์„ ์œ„ํ•ด ๊ณต๊ฐœ๋˜์—ˆ์œผ๋‚˜ ์ดํ›„์— WebGL ๋“ฑ์žฅ ์ดํ›„๋ถ€ํ„ฐ 3D ๊ฒŒ์ž„์ด๋‚˜ ๊ณ ๊ธ‰ 3D ๊ทธ๋ž˜ํ”ฝ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Babylonjs ๋ž€?

HTML5๋ฅผ ์ด์šฉํ•œ Web rendering engine ์œผ๋กœ ์ตœ๊ทผ(2๊ฐœ์›”์ „) version 5.3.0 release ํ•˜์˜€์œผ๋ฉฐ web api๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ์ง€ ์•Š์•„๋„ ๋น„๊ต์  ์‰ฝ๊ฒŒ 3D ๋ฐ 2D ๊ทธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฃฐ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค. ์ตœ์ดˆ ์„ค๋ฆฝ์ž๊ฐ€ ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์‚ฌ ๊ฐœ๋ฐœ์ž๋“ค์ด๋ฉฐ 2015๋…„๋„์— ์ปจํผ๋Ÿฐ์Šค์—์„œ ๊ณต๊ฐœํ•˜๋ฉฐ ํ˜„์žฌ๊นŒ์ง€ ๊พธ์ค€ํžˆ ๊ธฐ์—ฌ์ค‘์—์žˆ์Šต๋‹ˆ๋‹ค.

๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•ด๋ณด๊ธฐ

์šฐ์„  ๊ฐ€์žฅ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ Baybylonjs๋ฅผ ๊ฒฝํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
Baybylonjs ๊ณตํ™ˆ์— ๊ฐ€๋ณด๋ฉด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํˆด์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š” ์šฐ์„  ๊ทธ์ค‘์— playground๋ฅผ ํด๋ฆญํ•ด ๋“ค์–ด๊ฐ€ ๋ด…์‹œ๋‹ค.


babylonjs ๊ณต์‹ํ™ˆํŽ˜์ด์ง€ ์„ค๋ช… ์ด๋ฏธ์ง€

babylonjs ๊ณต์‹ํ™ˆํŽ˜์ด์ง€ ์„ค๋ช… ์ด๋ฏธ์ง€

๋“ค์–ด๊ฐ€๋ฉด ๋ฐ”๋กœ ๊ธฐ๋ณธ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ด๋Ÿฐ ํ™”๋ฉด์ด ๋“ฑ์žฅํ•  ํ…๋ฐ์š” ์—ฌ๊ธฐ์„œ ์ง์ ‘ ์ฝ”๋“œ๋ฅผ(Javascript, Typescript ์ž‘์„ฑ ๊ฐ€๋Šฅ) ์ž‘์„ฑํ•ด ์ž์‹ ๋งŒ์˜ ์ž‘์—…๋ฐ ์ €์žฅ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ €์žฅ์‹œ url์ด ์—…๋ฐ์ดํŠธ๋˜์–ด ํ•ด๋‹น playground ์—์„œ ๊พธ์ค€ํžˆ ์ž‘์—… ์ง„ํ–‰์ด ๊ฐ€๋Šฅํ•œ ์ •๋ง ์œ ์šฉํ•œ ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.
์ดํ›„ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋ฐ›์•„์„œ ๋กœ์ปฌ ๊ฐœ๋ฐœํ™˜๊ฒฝ์ด๋‚˜ ์›น์‚ฌ์ดํŠธ ๋ฐ ์„œ๋น„์Šค์— ํ™œ์šฉํ• ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// javascript
var createScene = function () {
  // This creates a basic Babylon Scene object (non-mesh)
  var scene = new BABYLON.Scene(engine);

  // This creates and positions a free camera (non-mesh)
  var camera = new BABYLON.FreeCamera(
    "camera1",
    new BABYLON.Vector3(0, 5, -10),
    scene
  );

  // This targets the camera to scene origin
  camera.setTarget(BABYLON.Vector3.Zero());

  // This attaches the camera to the canvas
  camera.attachControl(canvas, true);

  // This creates a light, aiming 0,1,0 - to the sky (non-mesh)
  var light = new BABYLON.HemisphericLight(
    "light",
    new BABYLON.Vector3(0, 1, 0),
    scene
  );

  // Default intensity is 1. Let's dim the light a small amount
  // light.intensity = 0.7;

  // Our built-in 'sphere' shape.
  var sphere = BABYLON.MeshBuilder.CreateSphere(
    "sphere",
    { diameter: 2, segments: 32 },
    scene
  );

  // Move the sphere upward 1/2 its height
  sphere.position.y = 1;

  // Our built-in 'ground' shape.
  var ground = BABYLON.MeshBuilder.CreateGround(
    "ground",
    { width: 6, height: 6 },
    scene
  );

  return scene;
};

์œ„๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์‹คํ–‰์ฝ”๋“œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.
๊ณต์‹ ํ™ˆํŽ˜์ด์ง€ docs๋ฅผ ๋ณด์‹œ๋ฉด ๊ตฌ์„ฑ๋„ ์ฒด๊ณ„์ ์ด๊ณ  ์„ค๋ช…๋„ ์ž์„ธํžˆ ๋˜์–ด์žˆ๋Š” ํŽธ์ž…๋‹ˆ๋‹ค(๋‹ค๋งŒ ์˜๋ฌธ๋งŒ ์žˆ์Šต๋‹ˆ๋‹คโ€ฆ)
์œ„์— ๋‚˜์™€์žˆ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋ช‡๋ช‡ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์„ค๋ช…ํ•˜์ž๋ฉด

var scene = new BABYLON.Scene(engine);

scene์€ ๋ง๊ทธ๋Œ€๋กœ canvas์— ๋ Œ๋”๋ง๋  ์žฅ๋ฉด์„ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

var camera = new BABYLON.FreeCamera("camera1",new BABYLON.Vector3(0, 5, -10),scene);

์นด๋ฉ”๋ผ๋Š” scene์ด ์ƒ์„ฑ๋˜๋ฉด ํ•„์ˆ˜๋กœ ์„ ์–ธ๋˜์–ด์•ผ ํ•˜๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค ์˜ˆ์ œ์ฝ”๋“œ์˜ ์นด๋ฉ”๋ผ๋Š” FreeCamera๋กœ ์‚ฌ์šฉ๋˜์—ˆ์œผ๋‚˜ docs๋ฅผ ๋ณด๋ฉด ์—ฌ๋Ÿฌ ์นด๋ฉ”๋ผ ๊ตฌ๋„๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
(Vertor3์€ x,y,z๋กœ ์œ„์น˜๊ฐ’์„ ์ง€์ •ํ•ด ์ฃผ๋Š”๊ฒ๋‹ˆ๋‹ค.)

var light = new BABYLON.HemisphericLight("light",new BABYLON.Vector3(0, 1, 0),scene);

light๋Š” scence์˜ ์กฐ๋ช…์ž…๋‹ˆ๋‹ค ์กฐ๋ช… ์—ญ์‹œ ์นด๋ฉ”๋ผ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜๊ฐ€ ์žˆ์œผ๋ฉฐ ์œ„์น˜๊ฐ’์„ ์กฐ์ ˆํ•ด 3D๋ชจ๋ธ์— ๋‹ค์–‘ํ•œ ์‹œ๊ฐ์  ํšจ๊ณผ๋ฅผ ์ค„์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

BABYLON.MeshBuilder

์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋Š” MeshBuilder๋ฅผ ์‚ฌ์šฉํ•ด babylon์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ตฌ์ฒด๋‚˜ ๊ทธ๋ผ์šด๋“œ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•ด์คฌ์ง€๋งŒ SceneLoader.ImportMesh๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ œ์ž‘๋œ 3D๋ชจ๋ธ์„ scene์— ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

BABYLON.SceneLoader.ImportMesh("myModel", "https://assets.babylonjs.com/meshes/", "HVGirl.glb", scene)

playground์—์„œ ์ž์‹ ๋งŒ์˜ ๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์™€ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ชจ๋ธ์„ git์ €์žฅ์†Œ์— ์˜ฌ๋ ค ํ•ด๋‹นurl์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Sketchfab์€ ๋งŽ์€ 3D๋ชจ๋ธ์„ ์ œ๊ณต ํ•˜๊ณ ์žˆ์œผ๋ฉฐ ๋ฌด๋ฃŒ๋‹ค์šด๋กœ๋“œ ํ• ์ˆ˜์žˆ๋Š” ๋ชจ๋ธ๋“ค๋„ ๋งŽ์•„ babylonjs๋ฅผ ์‚ฌ์šฉํ•ด 3D๋ชจ๋ธ์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์‹ถ๋‹ค๋ฉด ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์ฃผ์–ด ๋ชจ๋ธ์„ ๋‹ค์–‘ํ•˜๊ฒŒ ์ปจํŠธ๋กค ๋˜ํ•œ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ฆฌ๊น… ๋˜์–ด์žˆ๋‹ค๋ฉด ๋”์šฑ๋” ๋™์ ์ธ ํšจ๊ณผ๋„ ๊ธฐ๋Œ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ณต์‹ํ™ˆํŽ˜์ด์ง€์— ์žˆ๋Š” sambagirl ์ด๋ผ๋Š” ์ƒ˜ํ”Œ์ฝ”๋“œ๋กœ ๋™์ž‘ํ•˜๋Š” ํ™”๋ฉด์ž…๋‹ˆ๋‹ค wasd๋กœ ์ด๋™์ด ๊ฐ€๋Šฅํ•˜๊ณ  b๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ชจ๋ธ์— ๋ฆฌ๊น…๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค

Babylonjs๋Š” ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ํ™œ์šฉํ•˜์—ฌ ์›น๋ธŒ๋ผ์šฐ์ €์—์„œ ๊ฒŒ์ž„,์ „์‹œ,์ปค๋ฎค๋‹ˆํ‹ฐ ๋“ฑ๋“ฑ ๋งŽ์€ ์„œ๋น„์Šค๋“ค์„ ์‚ฌ์šฉ์ž๋“ค๋กœ ๋ถ€ํ„ฐ ๋”์šฑ๋” ์‹œ๊ฐ์ ์œผ๋กœ ํ’๋ถ€ํ•˜๊ฒŒ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

๋งˆ์น˜๋ฉฐ

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

ํฌ์ŠคํŒ… ์ฃผ์ œ๋ฅผ ์ƒ๊ฐํ•˜๋ฉฐ ๊ณ ๋ฏผ์ด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฃน์›๋ถ„๋“ค๊ป˜ WebGl๊ณผ Babylonjs๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์ € ์—ญ์‹œ ํ•ด๋‹น ๊ธฐ์ˆ ์— ํฌ๊ฒŒ ๊นŠ์ด๊ฐ€ ์žˆ์ง€ ์•Š์•„ ๊ณผ์—ฐ ์ž˜์ž‘์„ฑ์ด๋ ์ง€ ๊ฑฑ์ •์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์—ญ์‹œ๋‚˜ ์“ฐ๊ณ  ๋ณด๋‹ˆ ์งง๋ง‰ํ•œ ์†Œ๊ฐœ ๊ธ€ ์ •๋„๊ฐ€ ๋ผ๋ฒ„๋ฆฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹คโ€ฆ
๋‹ค์Œ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŒ…์‹œ๊ธฐ์— ์ข€ ๋” ๊ด€๋ จ ์ง€์‹์ด ํ’๋ถ€ํ•ด์ง„๋‹ค๋ฉด ์‹ฌํ™”ํ•œ ๋‚ด์šฉ์œผ๋กœ ํ•œ๋ฒˆ ๋” babylonjs์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ


Grow & Glow ยฉ 2025

Banner images by undraw.co