背景
前面讲了灯光、物体、材质,基本元素都讲了,这一节就当作业一样,打算是造一个立方体,涂上材质,让它动起来,作为我们无人车地图中的npc小车。
步骤
创建立方体
创建一个立方体,表示车。
const vehicleOptions = {
width: 5,
height: 2,
depth: 1.5
}
var myCar = BABYLON.MeshBuilder.CreateBox("myBox", vehicleOptions, scene);
这样子就只能看到一个box。需要加上ground。
创建地面
const options = {
width: 1000,
height: 1000,
subdivisions: 50
}
var ground = BABYLON.MeshBuilder.CreateGround('ground', options, scene)
groundBuilder的配置项还是比较少的。
- The parameters
widthandheight(floats, default 1) set the width and height sizes of the ground。 这两个参数来控制ground的长宽,在我们例子里设置为1000,用来表示无限大。 - The parameter
subdivisions(positive integer) sets the number of subdivisions per side,subdivisions是每条边的等分数。 - The mesh can be set to updatable with the boolean parameter
updatable(default false) if its internal geometry is supposed to change once created。是否可以更新。
增加地面的材质
我们选了图片纹理,用一个通用的方格图片。
这个时候的尺度是有问题的。设置uScale、vScale均为100.
这个小格子就会舒服很多。
然后把反光给关了。
var groundMaterial = new BABYLON.StandardMaterial('groundMat', scene)
groundMaterial.emissiveTexture = new BABYLON.Texture("http://10.101.16.11:5000/static/file/background.png", scene);
groundMaterial.emissiveTexture.uScale = 100
groundMaterial.emissiveTexture.vScale = 100
groundMaterial.disableLighting = true
ground.material = groundMaterial
增加立方体材质
在上面步骤中,我们已经有了有质感的地面,代表小车的立方体。那接下来需要把小车的几个面弄的好看一些。
const mat = new BABYLON.StandardMaterial('', scene)
mat.diffuseColor = Math.random() > 0.5 ? new BABYLON.Color3(1, 0, 0) : new BABYLON.Color3(0, 1, 0)
myCar.material = mat
增加立方体材质2
可以换个图片纹理。
其他改进
区分车头,这个等弄完画线,画地图之后在弄。
让车动起来
runRenderLoop里更改position就好了。这样子就可以看到小车缓缓动起来。
engine.runRenderLoop(function () {
myCar.position.x += 0.01
scene.render();
});
在实际场景中,小车在地图中运动,坐标位置都是直接传入的,直接赋值给小车的position.x和y就行。
源码
todo
这一节做了格demo,把前面几节的内容做了一个整合。
接下来的章节,我们将:
- 九,运动和移动,进一步掌握元素的运动操作。
- 十,导入模型,放一个真实的car
- 十一,模型的获取,聊一聊模型从哪儿来,stl这种模型
- 十二,画线,画车载箭头
- 十二,画线2,画地图
- 十三,demo2,地图+车运动
- 十四,业务逻辑:数据插值
- 十五,业务逻辑:红绿灯模型、终点模型、行人模型
- 十六,业务逻辑:相机进阶,followCamera
- 十七,demo3,完整无人车场景
- 后面就是其他进阶了