前面我们学习了如何画一堆房子(如下图),显然这单调的绿色大地,看上去效果并不好。

babylon.js中,可以用图片模拟出地势高低不同的效果,比如下面这张图片:

颜色越深的地方,表示地势越低(即:盆地),而颜色越浅的地方,地势越高(即:高山),可以参考下面的代码:

const createScene = () => {
const scene = new BABYLON.Scene(engine); const camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2.5, 200, new BABYLON.Vector3(0, 0, 0));
camera.attachControl(canvas, true);
const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(4, 1, 0)); //利用图片模拟地势高低不同的groud
const largeGround = BABYLON.MeshBuilder.CreateGroundFromHeightMap("largeGround", "../assets/img/villageheightmap.png",
{ width: 150, height: 150, subdivisions: 20, minHeight: 0, maxHeight: 10 }); return scene;
}

在线地址:https://yjmyzz.github.io/babylon_js_study/day07/01.html

再给它加上点草皮贴图:

代码如下:

const createScene = () => {
const scene = new BABYLON.Scene(engine); const camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2.5, 200, new BABYLON.Vector3(0, 0, 0));
camera.attachControl(canvas, true);
const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(4, 1, 0)); const largeGround = BABYLON.MeshBuilder.CreateGroundFromHeightMap("largeGround", "../assets/img/villageheightmap.png",
{ width: 150, height: 150, subdivisions: 20, minHeight: 0, maxHeight: 10 }); //给largeGround加上材质贴图
const largeGroundMat = new BABYLON.StandardMaterial("largeGroundMat");
largeGroundMat.diffuseTexture = new BABYLON.Texture("../assets/img//valleygrass.png");
largeGround.material = largeGroundMat; return scene;
}

在线地址:https://yjmyzz.github.io/babylon_js_study/day07/02.html
看上去有点模糊,我们还可以再贴一层,将山谷底部的区域,贴1块相对清晰点的图:

const createScene = () => {
const scene = new BABYLON.Scene(engine); const camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2.5, 30, new BABYLON.Vector3(0, 0, 0));
camera.attachControl(canvas, true);
const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(4, 1, 0)); const largeGround = BABYLON.MeshBuilder.CreateGroundFromHeightMap("largeGround", "../assets/img/villageheightmap.png",
{ width: 150, height: 150, subdivisions: 20, minHeight: 0, maxHeight: 10 }); const largeGroundMat = new BABYLON.StandardMaterial("largeGroundMat");
largeGroundMat.diffuseTexture = new BABYLON.Texture("../assets/img/valleygrass.png");
largeGround.material = largeGroundMat;
largeGround.position.y = -0.001; //再画一块相对较小的谷底区域
const ground = BABYLON.MeshBuilder.CreateGround("ground", { width: 24, height: 24 }); //将谷底贴个更清晰的图片
const groundMat = new BABYLON.StandardMaterial("groundMat");
groundMat.diffuseTexture = new BABYLON.Texture("../assets/img/villagegreen.png");
groundMat.diffuseTexture.hasAlpha = true;
ground.material = groundMat; return scene;
}

在线地址:https://yjmyzz.github.io/babylon_js_study/day07/03.html

再将先前画好的房屋导入:

const createScene = () => {
const scene = new BABYLON.Scene(engine); const camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 2, Math.PI / 2.5, 30, new BABYLON.Vector3(0, 0, 0));
camera.attachControl(canvas, true);
const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(4, 1, 0)); const largeGround = BABYLON.MeshBuilder.CreateGroundFromHeightMap("largeGround", "../assets/img/villageheightmap.png",
{ width: 150, height: 150, subdivisions: 20, minHeight: 0, maxHeight: 10 }); const largeGroundMat = new BABYLON.StandardMaterial("largeGroundMat");
largeGroundMat.diffuseTexture = new BABYLON.Texture("../assets/img/valleygrass.png");
largeGround.material = largeGroundMat;
largeGround.position.y = -0.001; const ground = BABYLON.MeshBuilder.CreateGround("ground", { width: 24, height: 24 });
const groundMat = new BABYLON.StandardMaterial("groundMat");
groundMat.diffuseTexture = new BABYLON.Texture("../assets/img/villagegreen.png");
groundMat.diffuseTexture.hasAlpha = true;
ground.material = groundMat; //导入村庄里的房屋
BABYLON.SceneLoader.ImportMeshAsync("", "../assets/glb/", "village.glb"); return scene;
}

在线地址:https://yjmyzz.github.io/babylon_js_study/day07/04.html

问题很明显:village.glb中自带了1个绿色的ground,得想办法把它去掉,好在加载glb文件里,可能指定回调函数

BABYLON.SceneLoader.ImportMeshAsync("", "../assets/glb/", "village.glb").then((result) => {
//把village.glb中自带的绿色ground设置为不可见
console.log(result);
var _ground = result.meshes[1];
_ground.isVisible = false;
});

在线地址:https://yjmyzz.github.io/babylon_js_study/day07/05.html
这样就行了,可能有同学会问:

1. 你咋知道meshes[1] 就是这个绿色的ground?

2. 你咋知道有isVisible属性,可以让它消失?

最简单的办法,就是console.log大法:

当然还可以用sandboxplayground 在线平台进行分析,大家可以自行试试。此外Mesh对象的各种属性,官方文档上也有详细说明

  

参考文档:

https://doc.babylonjs.com/features/introductionToFeatures/chap5/hills

babylon.js 学习笔记(7)的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  3. JS 学习笔记--9---变量-作用域-内存相关

    JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...

  4. WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)

    WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...

  5. WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法

    WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...

  6. WebGL three.js学习笔记 创建three.js代码的基本框架

    WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...

  7. vue.js 学习笔记3——TypeScript

    目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...

  8. 2019-4-29 js学习笔记

    js学习笔记一:js数据类型   1:基本数据类型       number类型(整数,小数)      String类型          boolean类型        NaN类型其实是一个nu ...

  9. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

  10. JS学习笔记5_DOM

    1.DOM节点的常用属性(所有节点都支持) nodeType:元素1,属性2,文本3 nodeName:元素标签名的大写形式 nodeValue:元素节点为null,文本节点为文本内容,属性节点为属性 ...

随机推荐

  1. 掌握DevEco Studio模拟器这些“隐藏功能”,让鸿蒙应用调试效率事半功倍

    在鸿蒙应用开发过程中,调试环节常常直接影响开发效率与体验.为提升开发者调试的便捷性与效率,华为在DevEco Studio上提供了模拟器功能,它不仅能模拟鸿蒙手机.折叠屏.平板等真实设备的基本功能,还 ...

  2. 【MOOC】华中科技大学计算机组成原理慕课答案-第五章-指令系统测试

    1 以下四种类型指令中,执行时间最长的是( ) (单选) A. 程序控制类指令 B. RR型指令 C. RS型指令 √D. SS型指令 SS型指令是两个操作数都存在主存中,慢. 2 程序控制类指令的功 ...

  3. 仿EXCEL插件,智表ZCELL产品V3.0 版本发布,底层采用canvas全部重构,功能大幅扩展,性能极致提升,满足千万级单元格加载

    本次更新是底层全部重构,按照现代浏览器要求,采用canvas方式进行了重构,预留了将来扩展空间,特别是在大数据量性能提升方面有了较大提升,可以满足千万级单元格加载,欢迎大家体验使用. 体验地址:zce ...

  4. SQL 日常练习 (十六)

    最近接触了一波 RPA, 可以用来做一些数据采集的事情, 或者任意控制电脑上的软件, 感觉上是挺厉害的, 但我就是不想用, 尽管我尝试了一波, 最后还是放弃 了, 我还是喜欢纯代码的工作方式, 最为讨 ...

  5. ubuntu 踩过的坑

    ubuntu安装中文输入法成功教程: https://zhuanlan.zhihu.com/p/508797663 博主希望尽量的不去宿主机中操作,达到对原系统的保护的效果,并且能够进行日常的深度学习 ...

  6. AI赋能金融风控:基于机器学习的智能欺诈检测系统实战教程

    引言 在数字化转型浪潮中,金融欺诈手段呈现智能化.隐蔽化趋势.传统规则引擎已难以应对复杂多变的欺诈模式,而机器学习技术通过自动学习数据特征,正在重塑金融风控体系.本文将基于Python生态,以信用卡欺 ...

  7. 第2讲、从启动到表单加载:Odoo 18 的完整执行流程详解

    了解 Odoo 在从启动到用户打开一个模型表单视图时,内部到底发生了什么,是模块开发.性能调优和故障排查的关键.本文将为你系统梳理 Odoo 18 的执行流程与关键方法调用链,适用于开发者与技术架构师 ...

  8. python时间戳转时间格式

    一.两种时间戳转换为时间格式:13位和10位,将时间戳转成时间格式 import time #13位时间戳转时间 tre_timeArray = time.localtime(164601220668 ...

  9. Spring注解之@Value基于Apollo或者YAML文件为静态变量赋值

    摘要:Spring Boot微服务中,把在Apollo配置中心或者YAML文件里配置的属性赋值给静态变量. 综述   Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环 ...

  10. Spring注解之@Autowired组件装配

    前言 说起Spring的@Autowired注解,想必大家已经耳熟能详:对于小编而言,虽然一直知道怎么用,但是并没有去了解过,因此,本文就梳理一下@Autowired注解的功能,如有写的不准确的地方, ...