Code Less, Create More!

Simple but useful code snippets for 3D Graphic Developers

glTF 3D Model

Babylon.js를 시작하기 위한 간단한 Boilerplate 예제

데브엑스 2023. 4. 25. 22:19
반응형

Babylon.js는 웹 브라우저에서 3D 게임 및 애니메이션을 개발하는 데 사용되는 오픈 소스 3D 게임 엔진입니다. WebGL과 HTML5 Canvas를 사용하여 실시간 3D 렌더링을 지원하며, 강력한 기능과 다양한 도구를 제공하여 개발자들이 높은 수준의 3D 경험을 만들 수 있도록 돕습니다. 이 포스트에서는 Babylon.js를 시작하는 데 도움이 될 수 있는 간단한 방법을 소개하겠습니다.

Babylon.js (https://www.babylonjs.com)

Babylon.js는 웹 애플리케이션에 멋진 시각적 효과를 만들기 위해 사용할 수 있는 3D 엔진입니다. 그러나 새로운 Babylon.js 프로젝트를 설정하는 것은 초보자에게는 어려울 수 있습니다.

보일러플레이트 코드는 새로운 또는 실험적인 프로젝트를 빠르게 시작하기에 적합한 방법입니다. 보일러플레이트 코드를 사용하면 기본 설정 코드를 처음부터 작성하지 않아도 되므로 시간이 절약되며 오류가 발생할 가능성도 줄어듭니다.

Babylon.js를 위한 보일러플레이트 코드는 보통 렌더러, 카메라 및 장면과 같은 Babylon.js 장면을 생성하는 데 필요한 기본 구성 요소를 포함합니다. 또한 사용자 정의 3D 모델로 수정하거나 대체할 수 있는 기본 객체(예: 큐브 또는 구)도 포함될 수 있습니다.

1. Babylon.js 시작하기

먼저, 프로젝트에 Babylon.js 라이브러리를 포함해야 합니다. 이를 위해 공식 웹사이트에서 라이브러리를 다운로드하거나 CDN 링크를 통해 포함할 수 있습니다.

아래는 CDN을 통해 라이브러리를 포함하는 방법의 예시입니다:

<script src="https://cdn.babylonjs.com/babylon.js"></script>

다음으로, 새로운 HTML 파일을 만들고 캔버스 요소를 추가합니다. 이 캔버스 요소는 Babylon.js의 렌더링 대상으로 사용됩니다.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Babylon.js Boilerplate</title>
    </head>
    <body>
        <canvas id="renderCanvas"></canvas>
        <script src="https://cdn.babylonjs.com/babylon.js"></script>
    </body>
</html>

이제 Babylon.js 의 Scene을 설정할 JavaScript 코드를 작성합니다. 다음 코드에서는 새로운 Babylon.js 엔진을 만들고, 새로운 씬을 생성하며, 씬을 보는 데 사용할 카메라를 만듭니다.

var canvas = document.getElementById("renderCanvas");
var engine = new BABYLON.Engine(canvas, true);

var createScene = function () {
    var scene = new BABYLON.Scene(engine);

    // Add your scene code here

    return scene;
};

var scene = createScene();

var camera = new BABYLON.ArcRotateCamera("Camera", -Math.PI / 2, Math.PI / 2, 10, BABYLON.Vector3.Zero(), scene);
camera.attachControl(canvas, true);

이 코드에서는 캔버스 요소를 가져와서 엔진을 만듭니다. 그리고 createScene이라는 함수를 정의합니다. 이 함수는 장면을 구성하기 위한 객체를 생성하는 Babylon.Scene()함수를 호출하여 Babylon.js Scene객체를 만듭니다. 여기에 추가적인 설정 코드를 추가할 수 있게 하고, 생성된 장면 객체를 반환합니다. 마지막으로, createScene 함수를 호출하여 장면을 만들고, 장면에 대한 카메라를 만듭니다.

여기서는 BABYLON.ArcRotateCamera 클래스를 사용하여 장면을 보는 데 사용할 카메라를 만듭니다. attachControl 메서드를 사용하여 카메라가 마우스와 상호 작용할 수 있도록 캔버스 요소에 연결합니다.

2. 3D 모델 로딩하기

Babylon.js는 glTF 형식을 비롯한 다양한 3D 모델 파일 형식을 로드할 수 있습니다. 아래는 예제로서 DamagedHelmet.glb (GLTF 샘플 모델)을 로드하는 코드입니다.

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Babylon.js GLTF Loader Example</title>
        <script src="https://cdn.babylonjs.com/babylon.js"></script>
        <script src="https://cdn.babylonjs.com/loaders/babylonjs.loaders.min.js"></script>
    </head>
    <body>
        <canvas id="renderCanvas"></canvas>
        <script>
            var canvas = document.getElementById("renderCanvas");
            var engine = new BABYLON.Engine(canvas, true);
            var createScene = function () {
                var scene = new BABYLON.Scene(engine);
                var camera = new BABYLON.ArcRotateCamera("Camera", -Math.PI/2, Math.PI/2, 5, BABYLON.Vector3.Zero(), scene);
                camera.attachControl(canvas, true);
                var light = new BABYLON.HemisphericLight("hemiLight", new BABYLON.Vector3(0, 1, 0), scene);
                light.intensity = 0.7;
                // Add environment map
                var hdrTexture = BABYLON.CubeTexture.CreateFromPrefilteredData("textures/environment.dds", scene);
                hdrTexture.gammaSpace = false;
                scene.environmentTexture = hdrTexture;
                BABYLON.SceneLoader.ImportMesh("", "", "DamagedHelmet.glb", scene, function (meshes) {
                    // do something with the meshes here
                    console.log(meshes);
                });
                return scene;
            }
            var scene = createScene();
            engine.runRenderLoop(function () {
                scene.render();
            });
        </script>
    </body>
</html>

이 예제에서는 먼저 Babylon.js 라이브러리와 Babylon.js GLTF 로더 라이브러리를 CDN 링크를 통해 포함합니다. 그리고 캔버스 요소를 만들고, createScene 함수를 정의하여 Babylon.js 씬을 새로 만들고, 카메라와 조명을 추가합니다.

createScene 함수에서는 BABYLON.SceneLoader 객체의 ImportMesh 함수를 사용하여 DamagedHelmet.glb 모델을 로드합니다. 첫 번째 매개변수는 앞에 접두사나 디렉토리를 추가하지 않겠다는 것을 나타내는 빈 문자열입니다. 두 번째 매개변수는 HTML 파일과 같은 디렉토리에 모델 파일이 있음을 나타내는 빈 문자열입니다. 세 번째 매개변수는 로드할 모델 파일의 이름입니다. 네 번째 매개변수는 모델을 로드할 씬 객체입니다. 다섯 번째 매개변수는 모델 로딩이 완료될 때 호출되는 콜백 함수입니다. ImportMesh 함수는 메시 객체의 배열을 반환합니다.

마지막으로, createScene 함수를 호출하여 새로운 씬을 만들고, runRenderLoop 함수를 사용하여 렌더링 루프를 시작합니다.

3. 환경 맵 로딩하기

위의 예제에서는 배경과 모델의 반사맵으로 사용하기 위해 환경 맵을 불러오는 기능이 추가되어 있습니다. 코드에서는 BABYLON.CubeTexture.CreateFromPrefilteredData 함수를 호출하여 hdrTexture 변수를 만듭니다. 이 함수는 환경 맵 파일의 경로를 매개변수로 받아 큐브 텍스처를 만듭니다. gammaSpace 속성은 색상이 감마 보정되지 않도록 false로 설정됩니다.
그런 다음 scene.environmentTexture 속성을 hdrTexture 변수로 설정하여 Babylon.js가 이 환경 맵을 조명과 반사에 사용하도록 지정합니다.

이 예제를 실행하면 적절한 조명과 반사로 DamagedHelmet 모델이 렌더링됩니다. 환경 맵 파일 경로를 수정하면 사용자 정의 환경 맵을 사용할 수 있습니다.

4. 결론

보일러플레이트 코드를 사용하면 프로젝트를 진행하는 데 많은 시간과 노력을 절약할 수 있으며, 창의적인 측면에 집중할 수 있습니다. 또한, 잘 구성된 코드 구조와 모범 사례를 고려하여 프로젝트가 견고한 기반 위에 구축되도록 보장합니다.
하지만, 보일러플레이트 코드는 시작점일 뿐이며, 프로젝트를 개발하면서 특정 요구사항에 맞게 코드를 수정하거나 사용자 정의할 필요가 있을 수 있습니다. 조명, 재질, 텍스처 등 추가 구성 요소를 추가하여 더욱 현실적이고 몰입도 있는 장면을 만들 수도 있습니다.

이렇게 간단한 보일러플레이트 코드를 사용하면 빠르게 새로운 실험적인 Babylon.js 프로젝트를 시작할 수 있으며, 프로젝트를 더 빠르고 효율적으로 시작할 수 있습니다.

반응형