首页 > 其他分享 >babylon.js 学习笔记(7)

babylon.js 学习笔记(7)

时间:2023-05-28 23:25:12浏览次数:48  
标签:const largeGroundMat babylon largeGround 笔记 js camera new BABYLON

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

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

标签:const,largeGroundMat,babylon,largeGround,笔记,js,camera,new,BABYLON
From: https://www.cnblogs.com/yjmyzz/p/babylon_js_study_7.html

相关文章

  • 发布-优化图片和js文件的存放路径
    把JavaScript文件同意生成到js目录中在webpack.config.js配置文件的output节点中,进行如下的配置:{test:/\.jpg|png|gif$/,use:'url-loader?limit=470&outputPath=images'}......
  • 《人月神话》阅读笔记七
    1、保持进度透明可见我们的团队在做项目的过程中,总是少不了实时汇报自己负责的部分进度,我们有时可能会担心,如果我们向上级或者负责人汇报了我们的完成进度,就有可能会因为某些问题扰乱我们的进度和计划。其实,如果我们隐瞒不报,就有可能助长我们的侥幸心理,从而在更大程度上影响我......
  • 并发相关笔记一
    并发和并行并行:指两个或多个时间在同一时刻发生(同时发生);并发:指两个或多个事件在一个时间段内发生。在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单CPU系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感......
  • 「学习笔记」(扩展)中国剩余定理
    有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?该问题出自《孙子算经》,具体问题的解答口诀由明朝数学家程大位在《算法统宗》中给出:三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五便得知。\(2\times70+3\times21+2\times15=233=2\times......
  • 《HTML入门笔记2》
    HTML常用标签分别有:a标签、img标签、table标签、form标签、input标签等。a标签(特别常用)a标签即超级链接,又叫超链接。一个网站通常由多个页面构成,进入网站时首先看到的就是其首页,如果想从首页跳转至其他页面,就需要在首页相应的位置添加超级链接。a标签其基本语法格式如......
  • 用redis项目练习笔记,跟着黑马敲,并有自己的理解在里面
    点评中,优惠卷牵扯到的秒杀问题。超卖现象如果多线程同时执行会因为高并发,先查询再插入之间会有空档时间,发生超卖问题。可以使用悲观锁或者乐观锁解决,出于对性能的考虑,用到了乐观锁。乐观锁的实现,用到了数据库where语句多加一个条件。每次判断跟上次相同,(这样会造成大量的失......
  • 软件工程日报——《人间》读书笔记
    总结以下《人件》这本书中涉及到的几个概念和建议1、帕金森定律帕金森定律讲述了如下的定律:如果一个很平庸的人作了管理,那么摆在它面前的只有三条路:退位给有能力的人。使用比自己更优秀的属下。运用比自己还平庸的手下。第一条路和第二条路一般是个有欲望的人,都不会采取,......
  • webpack-loader-使用babel-loader转换处理高级的js语法
    webpack只能打包处理一部分高级的JavaScript语法。对于那些webpack无法处理的高级js语法,需要借助于babel-loader进行打包处理。例如webpack无法处理下面的JavaScript代码://定义装饰器函数functioninfo(target){target.info='Personinfo.'}//定义一个普通的类@info......
  • 【ABAQUS文档笔记】实体单元
    来自ABAQUSDOCUMENT/GETTINGSTARTEDWITHABAQUS/CAE/USINGCONTINUUMELEMENTS单元公式和积分fullintegration“完全积分”是指当单元具有规则形状时,对单元刚度矩阵中的多项式项进行精确积分所需的高斯点数。对于六面体和四边形元素,“规则形状”意味着边缘是直的,并以直......
  • WPF 入门笔记 - 02 - 布局综合应用
    本篇博文对接上篇末尾处WPF常用布局控件的综合应用,为痕迹g布局控件介绍课后作业的一个思路方法。前言首先来谈一谈布局原则:WPF窗口只能包含一个元素(Window元素属于内容控件,内容控件只允许有一个子元素),所以我们得在窗口中放置一个容器,才能使我们的窗口放置更多的内容。所以......