在本章中,我们将学习使用网格构建器创建不同的形状.我们已经学习了如何在前面的章节中创建形状.
不同的是,使用meshbuilder可以灵活地为形状添加颜色和图像.
使用MeshBuilder的CreateBox
现在让我们看看如何使用MeshBuilder创建框.
Demo
BabylonJs - Basic Element-Creating Scene
输出
上面的代码行生成以下输出 :
对于上面的例子,我们使用了一个精灵图像,如下所示.它有水平3 Colums和垂直2行.
In在这个演示中,我们使用了一个名为cube.png的图像.图像存储在本地的图像/文件夹中,也粘贴在下面以供参考.请注意,cube.png是精灵图像,精灵图像是图像的集合.我们想在立方体上显示图像,因此希望立方体的所有边都在一起.您也可以下载您选择的类似精灵图像,并在演示链接中使用.
createBox构建器为您提供尺寸选项.
For例如,
var box = BABYLON.MeshBuilder.CreateBox("box",options,scene);
演示
var hSpriteNb = 3; // 3 sprites per raw ie colums horizontally as shown in the imagevar vSpriteNb = 2; // 2 sprite raws as shown in the image above.var faceUV = new Array(6); // the cube has 6 sides so creating array for same.for (var i = 0; i < 6; i++) { faceUV[i] = new BABYLON.Vector4(i/hSpriteNb, i/vSpriteNb, (i+1)/hSpriteNb, (i+1)/vSpriteNb);}var options = { width: 1.5, height: 1.5, depth: 1.5, faceUV: faceUV};
这称为使用createBox方法将纹理应用于meshbuilder.我们使用了图像 cube.png 水平3 colums和vertical 2 row.The cube或box有6个边.
要应用纹理,我们使用options参数.例如,
Var box = BABYLON.MeshBuilder.CreateBox('box',options,scene);
我们已经定义了一个名为faceUV的数组,其大小为6,它是多维数据集的两侧.该数组将始终具有Vector4元素.每个Vector4(x,y,z,w)将定义如下 :
x = Ubottom
y = Vbottom
z = Utop
w = Vtop
向量在[0,1]范围内. Ubottom和Vbottom是纹理裁剪开始的左下角的2D坐标. Utop,Vtop是纹理裁剪结束的右上角.
var hSpriteNb = 3; // 3 sprites per rawvar vSpriteNb = 2; // 2 sprite rawsvar faceUV = new Array(6);for (var i = 0; i < 6; i++) { faceUV[i] = new BABYLON.Vector4(i/hSpriteNb, i/vSpriteNb, (i+1)/hSpriteNb, (i+1)/vSpriteNb);}
假设默认纹理,即给定的图像应用于框的所有面.如果您只想更改框的1面或1面,您可以直接指定值,如下所示 :
var hSpriteNb = 3; // 3 sprites per rawvar vSpriteNb = 2; // 2 sprite rawsvar faceUV = new Array(6);faceUV[4] = new BABYLON.Vector4(0, 0, 1/hSpriteNb, 1/vSpriteNb);
示例
BabylonJs - Basic Element-Creating Scene
输出
上面的代码行生成以下输出 :
在本演示中,我们使用了一个名为3d.png的图像.图像存储在本地的图像/文件夹中,也粘贴在下面以供参考.请注意3d.png是一个精灵图像;精灵图像是图像的集合.我们想要将立方体的所有边都放在一个立方体上.您也可以下载您选择的类似精灵图像,并在演示链接中使用.
用于框和减号的纹理; images/3d.png
MeshCylinder
在本节中,我们将了解如何创建MeshCylinder.
要创建MeshCylinder,您需要使用类BABYLON.MeshBuilder.CreateCylinder.
该类的参数如下 :
var meshcylinder = BABYLON.MeshBuilder.CreateCylinder("meshcylinder", { height: 3, diameter: 35, tessellation: 52}, scene);
使用网格和网格构建器的CreateCylinder之间的区别是 - 你可以在meshbuilder中使用选项.现在我们使用高度,直径和曲面细分作为传递给圆柱体的选项.我们使用带有线框的标准材料作为此网格的材质.检查浏览器中的输出并查看柱面.您可以在游戏中使用类似的结构作为在场景中旋转的轮子.
演示
Babylon.js demo - Mesh Builder
输出
上面的代码行生成以下输出 :
使用网格构建器创建的许多形状现在将在一个演示中一起使用.以下演示链接中包含的形状将在后续章节中列出.
Ground
Cone
Plane
Disc
Torus
Polyhedron
IcoSphere
BabylonJS - 网格交点和点
网格游戏中的交叉非常重要,因为您知道当两个物体在游戏中相交时需要做什么.下面的演示中解释了相同的概念,即当网格相交时需要捕获的事件.
在下面给出的演示中,我们已经涵盖了以下两个概念 :
相交网格
相交点
BabylonJs - Basic Element-Creating Scene
输出
以上代码生成以下输出 :
说明
使用上面的代码,我们创建了一个圆柱体,线框为真.我们创造了3个球体.球体的原始颜色为绿色.
在 scene.registerBeforeRender 功能中,我们将根据与网格的交点更改球体的颜色.这里的柱面.
在 registerBeforeRender :
if (balloon1.intersectsMesh(cone, false)) { balloon1.material.emissiveColor = new BABYLON.Color3(1, 0, 0);} else { balloon1.material.emissiveColor = new BABYLON.Color3(0, 1, 0);}
intersectsMesh 如果与传递给它的参数中给出的网格相交,则给出true或false./p>
例如,
balloon1.intersectsMesh(cone,false);//cone在这里指的是圆柱网格.
球体的颜色变为红色,与圆柱体相交;否则,它是绿色的.
以下代码用于交叉和减去的点;
var pointToIntersect = new BABYLON.Vector3(10, 0, 0);if (balloon3.intersectsPoint(pointToIntersect)) { balloon3.material.emissiveColor = new BABYLON.Color3(0, 0, 0);}
这里, pointtoIntersect 变量是位于x轴上10的位置向量.如果球体穿过相交点,球体的颜色将变为黑色.
BabylonJS - 网格拾取碰撞
采摘碰撞实际上为您提供坐标,您可以将网格定位在该位置.鼠标拾取对象,您可以将鼠标放在用鼠标点击的位置.考虑到需要在用户单击鼠标的位置放置网格(对象);所以,在挑选碰撞的帮助下,它可以帮助你在点击位置的位置进行协调.
演示
<!doctype html> < html> < head> < meta charset ="utf-8"> < title> BabylonJs - 基本元素 - 创建场景 < script src ="babylon.js"> < style> canvas {width:100%;身高:100%;} < body> < canvas id ="renderCanvas"> < 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(1,1,1); //设置环境 var light0 = new BABYLON.PointLight("Omni",new BABYLON.Vector3(0,10,20),scene); var freeCamera = new BABYLON.FreeCamera("FreeCamera",new BABYLON.Vector3(0,0,-30),scene); var balloon1 = BABYLON.Mesh.CreateSphere("balloon1",5,1.0,scene); var balloon2 = BABYLON.Mesh.CreateSphere("balloon2",5,1.0,scene); balloon1.material = new BABYLON.StandardMaterial("matBallon",scene); balloon2.material = new BABYLON.StandardMaterial("matBallon",scene); balloon1.position = new BABYLON.Vector3(0,0,-0.1); balloon2.position = new BABYLON.Vector3(0,0,-0.1); balloon1.material.emissiveColor = new BABYLON.Color3(1,0,0); balloon2.material.emissiveColor = new BABYLON.Color3(0,0,1); //Wall var wall = BABYLON.Mesh.CreatePlane("wall",30.0,场景); wall.material = new BABYLON.StandardMaterial("wallMat",scene); wall.material.emissiveColor = new BABYLON.Color3(0.5,1,0.5); //当指针向下事件被引发时 scene.onPointerDown = function(evt,pickResult){//如果点击击中地面对象,我们更改影响位置 if(pickResult.hit){ var dateValue = new Date(); var secondNumber = dateValue.getSeconds(); if(secondNumber%2 == 0){ balloon1.position.x = pickResult.pickedPoint.x; balloon1.position.y = pickResult.pickedPoint.y; } else { balloon2.position.x = pickResult.pickedPoint.x; balloon2.position.y = pickResult.pickedPoint.y; } } }; 返回场景; }; var scene = createScene(); engine.runRenderLoop(function(){ scene.render(); });