Декали — это наклейки, наклеенные на объект. Рисование стикера выполняется с помощью 2D-изображения, которое нарисовано на сетке (например, объект в игре). В играх учтите, что у вас есть армейские пули, след от пули должен быть виден на объекте. Таким образом, в Babylonjs это делается с помощью надписей, в которых, когда вы нажимаете на любой объект, вы рисуете 2D-изображение в том месте, где вы его щелкнули.
Декали используются для добавления деталей созданной сетки — таких как пули, отверстия и т. Д. В приведенной ниже демонстрационной ссылке мы используем изображение и добавляем его в импортированную сетку.
Чтобы добавить наклейку, вы можете использовать следующий код —
var newDecal = BABYLON.Mesh.CreateDecal("decal", mesh, decalPosition, normal, decalSize, angle);
Следующий код выполняется для добавления надписей на сетку —
BABYLON.SceneLoader.ImportMesh("Shcroendiger'scat", "scenes/", "SSAOcat.babylon", scene, function (newMeshes) { var cat = newMeshes[0]; / /this is mesh shown on the screen. // Set the target of the camera to the first imported mesh camera.target = cat; var decalMaterial = new BABYLON.StandardMaterial("decalMat", scene); decalMaterial.diffuseTexture = new BABYLON.Texture("images/impact1.jpg", scene); decalMaterial.diffuseTexture.hasAlpha = true; decalMaterial.zOffset = -2; var onPointerDown = function (evt) { if (evt.button !== 0) { return; } // check if we are under a mesh var pickInfo = scene.pick(scene.pointerX, scene.pointerY, function (mesh) { return mesh === cat; // this will give all the meshes , but it will pick the mesh whch is same as cat and return true if it is found }); if (pickInfo.hit) { // if true var decalSize = new BABYLON.Vector3(5, 5, 5); //size of decal is defined var newDecal = BABYLON.Mesh.CreateDecal("decal", cat, pickInfo.pickedPoint, pickInfo.getNormal(true), decalSize); //decal is created newDecal.material = decalMaterial; //decal material is added. } } var canvas = engine.getRenderingCanvas(); canvas.addEventListener("pointerdown", onPointerDown, false); scene.onDispose = function () { canvas.removeEventListener("pointerdown", onPointerDown); } });
демонстрация
<!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); //Adding a light var light = new BABYLON.HemisphericLight("Hemi", new BABYLON.Vector3(0, 1, 0), scene); //Adding an Arc Rotate Camera var camera = new BABYLON.ArcRotateCamera("Camera", -1.85, 1.2, 200, BABYLON.Vector3.Zero(), scene); camera.attachControl(canvas, true); // The first parameter can be used to specify which mesh to import. Here we import all meshes BABYLON.SceneLoader.ImportMesh("Shcroendiger'scat", "scenes/", "SSAOcat.babylon", scene, function (newMeshes) { var cat = newMeshes[0]; // Set the target of the camera to the first imported mesh camera.target = cat; var decalMaterial = new BABYLON.StandardMaterial("decalMat", scene); decalMaterial.diffuseTexture = new BABYLON.Texture("images/impact1.jpg", scene); decalMaterial.diffuseTexture.hasAlpha = true; decalMaterial.zOffset = -2; var onPointerDown = function (evt) { if (evt.button !== 0) { return; } // check if we are under a mesh var pickInfo = scene.pick(scene.pointerX, scene.pointerY, function (mesh) { return mesh === cat; }); if (pickInfo.hit) { var decalSize = new BABYLON.Vector3(5, 5, 5); var newDecal = BABYLON.Mesh.CreateDecal("decal", cat, pickInfo.pickedPoint, pickInfo.getNormal(true), decalSize); newDecal.material = decalMaterial; } } var canvas = engine.getRenderingCanvas(); canvas.addEventListener("pointerdown", onPointerDown, false); scene.onDispose = function () { canvas.removeEventListener("pointerdown", onPointerDown); } }); return scene; }; var scene = createScene(); engine.runRenderLoop(function() { scene.render(); }); </script> </body> </html>
В приведенной выше демонстрационной ссылке мы использовали сетку SSAOcat.babylon. Вы можете скачать файл json для SSAOcat.babylon отсюда —
Сохраните файл в папке сцены /. Это поможет вам получить результат, как показано ниже.
Выход
Выше строка кода генерирует следующий вывод —
В этой демонстрации мы использовали изображение effect1.jpg . Изображения хранятся в папке images / локально, а также вставляются ниже для справки. Вы можете скачать любое изображение по вашему выбору и использовать в демонстрационной ссылке.
Изображения / impact1.jpg