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

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大法:


当然还可以用sandbox 或 playground 在线平台进行分析,大家可以自行试试。此外Mesh对象的各种属性,官方文档上也有详细说明
参考文档:
https://doc.babylonjs.com/features/introductionToFeatures/chap5/hills
babylon.js 学习笔记(7)的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- JS 学习笔记--9---变量-作用域-内存相关
JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...
- WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)
WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...
- WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法
WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...
- WebGL three.js学习笔记 创建three.js代码的基本框架
WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...
- vue.js 学习笔记3——TypeScript
目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...
- 2019-4-29 js学习笔记
js学习笔记一:js数据类型 1:基本数据类型 number类型(整数,小数) String类型 boolean类型 NaN类型其实是一个nu ...
- 一点感悟:《Node.js学习笔记》star数突破1000+
写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...
- JS学习笔记5_DOM
1.DOM节点的常用属性(所有节点都支持) nodeType:元素1,属性2,文本3 nodeName:元素标签名的大写形式 nodeValue:元素节点为null,文本节点为文本内容,属性节点为属性 ...
随机推荐
- Java--事务,操作数据库,实现转账
更新:2019/3/29 目录 简介 事务的四个特性 一个小Demo 目录结构 jdbc.properties JDBCUtil.java TestTransaction.java[核心代码] 数据库 ...
- SpringBoot整合Web层技术
目录 1 SpringBoot整合Web层技术 1.1 SpringBoot整合Servlet 1.1.1 方式一 通过注解扫描完成Servlet组件的注册 1.1.1.1 创建Servlet 1.1 ...
- 【工具】FFmpeg|压缩视频,500MB变25MB(有损,支持 Windows、Linux、macOS 各个平台)
参考: 如何将一分钟长的1080p视频压缩至5MB以内?-知乎-滔滔清风 近期HEVC扩展备用安装方法-B站-悲剧天下 总共三个步骤,安装FFmpeg.运行指令.打开视频. 亲测 500MB 变 25 ...
- K8s进阶之一文搞懂PV,PVC及SC
前言 想了解Pod的基本存储,可以参考这篇文章:K8s新手系列之Pod的基本存储 概述 官方文档: 配置Pod使用PV进行存储:https://kubernetes.io/zh-cn/docs/tas ...
- ciscn暨长城杯 广东赛区 ISW阶段应急响应
ciscn暨长城杯 广东赛区 ISW阶段应急响应 题目介绍 小路是一名网络安全网管,据反映发现公司主机上有异常外联信息,据回忆前段时间执行过某些更新脚本(已删除),现在需要协助小路同学进行网络安全应急 ...
- python爬虫学习——xlwt库,sqlite库
xlwt库主要是对excel进行操作,主要流程就是创建对象,创建工作表,写入数据,保存数据表.代码练习如下 ''' import xlwt workbook = xlwt.Workbook(encod ...
- K8S的API Server认证介绍
一.说明 kube-apiserver是k8s最重要的制组件之一,主要提供以下功能: 提供集群管理的REST API 接口, 包括认证授权.数据校验以及集群状态变更等 k8s 中所有模块与 etcd ...
- 生活中有苦难却没有人可以倾述?来看看AI树洞吧!
本文由 ChatMoney团队出品 介绍说明 在如今繁忙喧嚣的世界中,我们时常渴望能有一个安全且私密的空间,让我们毫无顾忌地袒露心声.AI 智能体树洞便是这样一个独特的存在. 它并非传统意义上的树洞, ...
- hot100之链表下
K个一组翻转链表(025) 先看代码 class Solution { public ListNode reverseKGroup(ListNode head, int k) { ListNode d ...
- 100条常用SQL语句
一.基本查询语句 查询所有数据: SELECT * FROM 表名; 查询特定列: SELECT 列名1, 列名2 FROM 表名; 条件查询: SELECT * FROM 表名 WHERE 条件; ...