Babylonjs ๋ค๋ค๋ณด๊ธฐ
WebGL Frameworks ๊ฒฝํํด๋ณด๊ธฐ
Jun 25, 2022
๋ค์ด๊ฐ๋ฉฐ
์ด์ ์ 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๋ฅผ ํด๋ฆญํด ๋ค์ด๊ฐ ๋ด
์๋ค.


๋ค์ด๊ฐ๋ฉด ๋ฐ๋ก ๊ธฐ๋ณธ์ฝ๋์ ํจ๊ป ์ด๋ฐ ํ๋ฉด์ด ๋ฑ์ฅํ ํ
๋ฐ์ ์ฌ๊ธฐ์ ์ง์ ์ฝ๋๋ฅผ(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์ ๋ํด์ ์๊ฐํด๋ณด๊ฒ ์ต๋๋ค.