BabylonJS - Materiały

Materiały są jak ubrania dla przedmiotów. Możesz dodać kolor, teksturę i owinąć nią swoje oczka. Możesz użyć tego samego materiału do pokrycia wielu oczek. Siatki mogą być sceną, którą właśnie widzieliśmy w przykładzie w poprzednim rozdziale - samolot przelatujący po niebie.

W tym rozdziale nauczymy się, jak dodać kolor, teksturę i odbicie do siatek w tym rozdziale.

Dodamy materiał do już utworzonej sceny. Będziemy postępować, dodając materiał do wszystkich stworzonych przez nas kształtów.

Rozważmy kilka przykładów, aby zobaczyć, jak działa dodanie materiału.

Składnia

var materialforshapes = new BABYLON.StandardMaterial("texture1", scene);

Powyższy materiał nic nie zmieni, ponieważ jest domyślny. Wykorzystamy dostępne właściwości, aby obiekty wyglądały bardziej atrakcyjnie.

Dostępne właściwości są następujące -

  • Transparency

  • Diffuse

  • Emissive

  • Ambient

  • Specular

  • Zabijanie tylnej części twarzy

  • WireFrame

Zobacz, jak te właściwości zastosowane na materiale zmieniają wygląd i dotyk siatki.

Podstawowa właściwość materiału - FresnelParameters

Fresnel to nowa rzecz dodana przez BabylonJS na standardmaterial. Pozwala na zmianę koloru naniesionego na kształty. Możesz uzyskać szklane odbicie, używając prostego Fresnela. Fresnel pozwoli Ci lepiej odbić na krawędziach, a nie na środku.

Następujące właściwości są dostępne dla Fresnela

StandardMaterial.diffuseFresnelParameters
StandardMaterial.opacityFresnelParameters
StandardMaterial.reflectionFresnelParameters
StandardMaterial.emissiveFresnelParameters
StandardMaterial.refractionFresnelParameters

Próbny

<!doctype html>
<html>
   <head>
      <meta charset = "utf-8">
      <title>BabylonJs - Basic Element-Creating Scene</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);

            var camera = new BABYLON.ArcRotateCamera("camera1", 0, 0, 10, BABYLON.Vector3.Zero(), scene);

            camera.setPosition(new BABYLON.Vector3(0, 5, -10));

            camera.attachControl(canvas);
            camera.upperBetaLimit = Math.PI / 2;
            camera.lowerRadiusLimit = 4;

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

            var knot = BABYLON.Mesh.CreateTorusKnot("knot", 1, 0.4, 128, 64, 2, 3, scene);	
            var yellowSphere = BABYLON.Mesh.CreateSphere("yellowSphere", 16, 1.5, scene);
            yellowSphere.setPivotMatrix(BABYLON.Matrix.Translation(3, 0, 0));
            var yellowMaterial = new BABYLON.StandardMaterial("yellowMaterial", scene);
            yellowMaterial.diffuseColor = BABYLON.Color3.Yellow();
            yellowSphere.material = yellowMaterial;    

            // Ground
            var ground = BABYLON.Mesh.CreateBox("Mirror", 1.0, scene);
            ground.scaling = new BABYLON.Vector3(100.0, 0.01, 100.0);
            ground.material = new BABYLON.StandardMaterial("ground", scene);
            ground.material.diffuseTexture = new BABYLON.Texture("images/rainbow.png", scene);
            ground.material.diffuseTexture.uScale = 10;
            ground.material.diffuseTexture.vScale = 10;
            ground.position = new BABYLON.Vector3(0, -2, 0);

            // Main material	
            var mainMaterial = new BABYLON.StandardMaterial("main", scene);
            knot.material = mainMaterial;

            var probe = new BABYLON.ReflectionProbe("main", 512, scene);
            probe.renderList.push(yellowSphere);
            probe.renderList.push(ground);
            mainMaterial.diffuseColor = new BABYLON.Color3(1, 0.5, 0.5);
            mainMaterial.refractionTexture = probe.cubeTexture;
            mainMaterial.refractionFresnel<h3>Parameters</h3> = new BABYLON.Fresnel<h3>Parameters</h3>();
            mainMaterial.refractionFresnel<h3>Parameters</h3>.bias = 0.5;
            mainMaterial.refractionFresnel<h3>Parameters</h3>.power = 16;
            mainMaterial.refractionFresnel<h3>Parameters</h3>.leftColor = BABYLON.Color3.Black();
            mainMaterial.refractionFresnel<h3>Parameters</h3>.rightColor = BABYLON.Color3.White();
            mainMaterial.indexOfRefraction = 1.05;

            // Fog
            scene.fogMode = BABYLON.Scene.FOGMODE_LINEAR;
            scene.fogColor = scene.clearColor;
            scene.fogStart = 20.0;
            scene.fogEnd = 50.0;

            // Animations
            scene.registerBeforeRender(function () {
               yellowSphere.rotation.y += 0.01;
               //  greenSphere.rotation.y += 0.01;
            });
            return scene;
         };
         var scene = createScene();
         engine.runRenderLoop(function() {
            scene.render();
         });
      </script>
   </body>
</html>

Wynik

Powyższy wiersz kodu generuje następujące dane wyjściowe -

Wyjaśnienie

Poniższy kod stosuje efekt Fresnela. Kolory lewy i prawy są stosowane do krawędzi siatek.

mainMaterial.refractionFresnelParameters = new BABYLON.FresnelParameters();
mainMaterial.refractionFresnelParameters.bias = 0.5;
mainMaterial.refractionFresnelParameters.power = 16;
mainMaterial.refractionFresnelParameters.leftColor = BABYLON.Color3.Black();
mainMaterial.refractionFresnelParameters.rightColor = BABYLON.Color3.White();

Odchylenie i moc kontrolują efekt Fresnela na powierzchni.

W tym demo użyliśmy obrazu o nazwie rainbow.png. Obrazy są przechowywane lokalnie w folderach images / folder. Możesz pobrać dowolny wybrany obraz i użyć go w linku demonstracyjnym.