BabylonJS-사운드 및 음악 재생

소리와 음악이 없으면 게임은 불완전합니다. BabylonJS 사운드 엔진은 게임에 사운드 효과를 추가하는 데 도움이되는 API와 함께 제공됩니다. 게임에서 전투가 보이면 총을 쏘아 야합니다. babylonjs 사운드 엔진으로도 마찬가지입니다. 게임에 키보드 / 마우스 컨트롤 효과를 기반으로 사운드 효과를 얻을 수 있습니다. 사운드 엔진은 주변 사운드, 특수 사운드 및 방향성 사운드를 제공합니다. 엔진은 .mp3 및 .wav 사운드 형식을 지원합니다.

통사론

var music = new BABYLON.Sound(
   "Music", "sound.wav", scene, null, { 
      loop: true, 
      autoplay: true 
   }
);

매개 변수

사운드 엔진과 관련된 다음 매개 변수를 고려하십시오.

  • Name − 소리의 이름.

  • URL − 재생할 사운드의 URL.

  • Scene − 사운드가 재생되어야하는 장면.

  • Callbackfunction− 사운드를 재생할 준비가되었을 때 호출되는 콜백 함수로 현재는 null입니다. 몇 가지 예를 살펴보고 사용 방법을 배웁니다.

  • Json object −이 개체에는 수행해야 할 작업에 대한 기본 세부 정보가 있습니다.

  • sound.autoplay −이를 통해 파일이 다운로드되면 사운드가 자동으로 재생됩니다.

  • loop:true − 이는 사운드가 계속해서 반복 재생됨을 의미합니다.

프로젝트 디렉토리에 사운드 폴더를 만들고 샘플 오디오 파일을 다운로드하여 출력을 테스트합니다.

이제 이미 만든 장면에 사운드를 추가해 보겠습니다.

데모

<!doctype html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>BabylonJs - Basic Scene- Playing sounds and music</title>
      <script src = "babylon.js"></script>
      <style>
         canvas {width: 100%; height: 100%;}
      </style>
   </head>
   
   <body>
      <canvas id = "renderCanvas"></canvas>
      <script type = "text/javascript">
         var canvas = document.getElementById("renderCanvas");
         var engine = new BABYLON.Engine(canvas, true);
         var createScene  = function() {
            var scene = new BABYLON.Scene(engine);
            scene.clearColor = new BABYLON.Color3(0, 1, 0);
            
            var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
            camera.attachControl(canvas, true);
            
            var music = new BABYLON.Sound("sound", "sounds/scooby.wav", scene, null, { 
               loop: true, 
               autoplay: true 
            });	
            return scene;
         };
         var scene = createScene();
         engine.runRenderLoop(function() {
            scene.render();
         });
      </script>
   </body>
</html>

산출

위의 코드 줄은 다음 출력을 생성합니다.

이제 어떻게 callback기능이 작동합니다. 사운드 자동 재생을 원하지 않거나 원할 때만 사운드를 재생하려면 콜백 함수를 사용하면됩니다.

예를 들면

Var music = new BABYLON.Sound ("Music", "music.wav", scene, function callback() {music.play();});

데모

<!doctype html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>BabylonJs - Basic Scene- Playing sounds and music</title>
      <script src = "babylon.js"></script>
      <style>
         canvas {width: 100%; height: 100%;}
      </style>
   </head>

   <body>
      <canvas id = "renderCanvas"></canvas>
      <script type = "text/javascript">
         var canvas = document.getElementById("renderCanvas");
         var engine = new BABYLON.Engine(canvas, true);
         var createScene  = function() {
            var scene = new BABYLON.Scene(engine);
            scene.clearColor = new BABYLON.Color3(0, 1, 0);
            
            var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
            camera.attachControl(canvas, true)
            
            var music = new BABYLON.Sound(
               "sound", "sounds/scooby.wav", scene, function callback() { setTimeout(function() {music.play();}, 5000)});	
            return scene;
         };
         var scene = createScene();
         engine.runRenderLoop(function() {
            scene.render();
         });
      </script>
   </body>
</html>

콜백에서는 setTimeout을 사용합니다. 즉, 특정 시간 후에 만 ​​사운드가 재생되기를 원합니다. 5 초를 타이머로 추가 했으므로 Scooby.wav 파일이 다운로드되고 5 초가 완료되면 사운드가 재생됩니다.

키보드의 클릭 및 키로 사운드 재생

장면의 아무 곳이나 클릭하면 폭발음이 들리고 왼쪽, 오른쪽, 위, 아래 화살표 키 중 하나를 누르면 폭발음 효과가 재생됩니다.

클릭을 위해 이벤트를 첨부합니다 onmousedown창과 키의 경우 keydown 이벤트를 사용합니다. 키 코드에 따라 사운드가 재생됩니다.

데모

<!doctype html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>BabylonJs - Basic Scene- Playing sounds and music</title>
      <script src = "babylon.js"></script>
      <style>
         canvas {width: 100%; height: 100%;}
      </style>
   </head>

   <body>
      <canvas id = "renderCanvas"></canvas>
      <script type = "text/javascript">
         var canvas = document.getElementById("renderCanvas");
         var engine = new BABYLON.Engine(canvas, true);
         var createScene  = function() {
            var scene = new BABYLON.Scene(engine);
            scene.clearColor = new BABYLON.Color3(0, 1, 0);
            
            var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
            camera.attachControl(canvas, true)
            
            var sound = new BABYLON.Sound("gunshot", "sounds/explosion.wav", scene);

            window.addEventListener("mousedown", function (evt) {	
               if (evt.button === 0) { // onclick
                  sound.play();
               }
            });

            window.addEventListener("keydown", function (evt) { // arrow key left right up down
               if (evt.keyCode === 37 || evt.keyCode === 38 || evt.keyCode === 39 || evt.keyCode === 40) {
                  sound.play();
               }
            });		
            return scene;
         };
         var scene = createScene();
         engine.runRenderLoop(function() {
            scene.render();
         });
      </script>
   </body>
</html>

산출

위의 코드 줄은 다음 출력을 생성합니다.

처음에 접했던 json 객체의 사운드 볼륨을 제어 할 수 있습니다.

예를 들면

Var music = new BABYLON.Sound("sound", "sounds/scooby.wav", scene, null, { 
   loop: true, 
   autoplay: true, 
   volume:0.5 
});

사운드 파일이 언제 끝났는지 알기 위해 다음과 같이 사용할 수있는 이벤트가 있습니다.

music.onended = function () {	
   console.log("sound ended");
   
   //you can do the required stuff here like play it again or play some other sound etc.
};

SetVolume 속성은 생성자 외에 사운드를 제어하려는 경우에도 사용할 수 있습니다.

예를 들면

music.setVolume(volume);

장면에서 둘 이상의 사운드를 재생하는 경우 생성 된 모든 사운드에 대해 전역 사운드를 설정할 수 있습니다.

예를 들면

BABYLON.Engine.audioEngine.setGlobalVolume(0.5);

공간 3D 사운드 생성

사운드를 공간 사운드 (우주 사운드와 유사한 사운드)로 변환하려면 사운드 생성자에 옵션을 추가해야합니다.

예를 들면

var music = new BABYLON.Sound("music", "sounds/explosion.wav", scene, null, { 
   loop: false, 
   autoplay: true, 
   spatialSound: true 
});

다음은 공간 사운드에 대한 다양한 옵션입니다.

  • DistanceModel− 기본적으로 "선형"방정식을 사용합니다. 다른 옵션은 "역"또는 "지수"입니다.

  • MaxDistance − 100으로 설정되어 있습니다. 이는 청취자가 사운드에서 100 단위 이상 떨어지면 볼륨이 0이됨을 의미합니다. 더 이상 사운드를들을 수 없습니다.

  • PanningModel−“HRTF”로 설정되어 있습니다. 사양은 인간 피험자로부터 측정 된 임펄스 응답을 가진 컨볼 루션을 사용하는 더 높은 품질의 공간화 알고리즘이라고 말합니다. 스테레오 출력을 나타냅니다.

  • MaxDistance − distanceModel이 선형 일 때만 사용되며 역 또는 지수와 함께 사용되지 않습니다.

공간 사운드 데모

<!doctype html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>BabylonJs - Basic Scene- Playing sounds and music</title>
      <script src = "babylon.js"></script>
      <style>
         canvas {width: 100%; height: 100%;}
      </style>
   </head>

   <body>
      <canvas id = "renderCanvas"></canvas>
      <script type = "text/javascript">
         var canvas = document.getElementById("renderCanvas");
         var engine = new BABYLON.Engine(canvas, true);
         var createScene  = function() {
            var scene = new BABYLON.Scene(engine);
            scene.clearColor = new BABYLON.Color3(0, 1, 0);
            
            var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
            camera.attachControl(canvas, true);	
            
            var music = new BABYLON.Sound(
               "music", "sounds/explosion.wav", scene, null, {
                  loop: false, autoplay: true, spatialSound: true, distanceModel: "exponential"
               }
            );
            return scene;
         };
         var scene = createScene();
         engine.runRenderLoop(function() {
            scene.render();
         });
      </script>
   </body>
</html>

메시에 사운드 부착

BABYLON.Sound를 사용하여 메시에 사운드를 첨부 할 수 있습니다. 메시가 움직이면 소리도 함께 움직입니다.AttachtoMesh (mesh) 사용할 방법입니다.

데모

<!doctype html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>BabylonJs - Basic Scene- Playing sounds and music</title>
      <script src = "babylon.js"></script>
      <style>
         canvas {width: 100%; height: 100%;}
      </style>
   </head>

   <body>
      <canvas id = "renderCanvas"></canvas>
      <script type = "text/javascript">
         var canvas = document.getElementById("renderCanvas");
         var engine = new BABYLON.Engine(canvas, true);
         var createScene  = function() {
            var scene = new BABYLON.Scene(engine);
            scene.clearColor = new BABYLON.Color3(0, 1, 0);

            var camera = new BABYLON.ArcRotateCamera("Camera", 1, 0.8, 10, new BABYLON.Vector3(0, 0, 0), scene);
            camera.attachControl(canvas, true);

            var materialforbox = new BABYLON.StandardMaterial("texture1", scene);
            var box = BABYLON.Mesh.CreateBox("box", '2', scene);	
            box.material  = materialforbox;
            materialforbox.ambientColor = new BABYLON.Color3(1, 0, 0.2);

            var music = new BABYLON.Sound("music", "sounds/explosion.wav", scene, null, { 
               loop: false, 
               autoplay: true, 
               spatialSound: true, 
               distanceModel: "exponential"
            });	
            music.attachToMesh(box);
            return scene;
         };
         var scene = createScene();
         engine.runRenderLoop(function() {
            scene.render();
         });
      </script>
   </body>
</html>

산출

위의 코드 줄은 다음 출력을 생성합니다.