上回继续,现在的村庄已经有点象样了,但是远处的背景仍比较单调(如下图),今天来学习如何处理天空背景。

babylon.js中,把整个空间假象成一个巨大的立方体(称为SkyBox),然后依次给立方体的6个面,贴上天空的背景图(如下图)

在代码中只要指定这6张图的rootUrl即可,babylon.js会自动拼上一系列后缀,按如下约定去加载图片:

_px.jpg _nx.jpg _py.jpg _ny.jpg _pz.jpg _nz.jpg

这个不用死记:p指positive(坐标轴正向),n指negtive(坐标轴负向),所以_px.jpg,即贴在x轴正向(即:立方体右面),类似的 _nz.jpg,就是z轴负方向(立方体前面)

参考代码如下:重点在于CubeTexture的使用

var createScene = function () {
var scene = new BABYLON.Scene(engine);
var camera = new BABYLON.ArcRotateCamera("Camera", -Math.PI / 2, Math.PI / 2, 40, new BABYLON.Vector3(0, 0, 0), scene);
camera.attachControl(canvas, true); var light = new BABYLON.HemisphericLight("hemiLight", new BABYLON.Vector3(-1, 1, 0), scene);
light.diffuse = new BABYLON.Color3(1, 0, 0); // Skybox
var skybox = BABYLON.MeshBuilder.CreateBox("skyBoxDemo", { size: 15.0 }, scene);
var skyboxMaterial = new BABYLON.StandardMaterial("skyBox1", scene);
skyboxMaterial.backFaceCulling = false;
skyboxMaterial.reflectionTexture = new BABYLON.CubeTexture("../assets/img/sky/skybox", scene);
skyboxMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.SKYBOX_MODE;
skyboxMaterial.diffuseColor = new BABYLON.Color3(0, 0, 0);
skyboxMaterial.specularColor = new BABYLON.Color3(0, 0, 0);
skybox.material = skyboxMaterial; return scene; };

注意目录的相对路径:

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

当这个SkyBox放到足够大时,就会产生天空背景的效果:

var createScene = function () {
...
//设置摄像机的radius为5(离目标近一点)
var camera = new BABYLON.ArcRotateCamera("Camera", -Math.PI / 2, Math.PI / 2, 5, BABYLON.Vector3.Zero(), scene);
...
//Skybox(设置size调整成1000)
var skybox = BABYLON.MeshBuilder.CreateBox("skyBoxDemo", { size: 1000.0 }, scene);
...
return scene; };

在线地址 :https://yjmyzz.github.io/babylon_js_study/day08/02.html

将这个天空背景应用到先前画的村庄:

const createScene = () => {
const scene = new BABYLON.Scene(engine); const camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 3.5, Math.PI / 1.5, 30, new BABYLON.Vector3(0, 0, 0)); camera.attachControl(canvas, true);
const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(1, 1, 0)); //导入村庄的模型
BABYLON.SceneLoader.ImportMeshAsync("", "../assets/glb/", "valleyvillage.glb"); // Skybox
var skybox = BABYLON.MeshBuilder.CreateBox("skybox", { size: 1000.0 }, scene);
var skyboxMaterial = new BABYLON.StandardMaterial("skybox", scene);
skyboxMaterial.backFaceCulling = false;
skyboxMaterial.reflectionTexture = new BABYLON.CubeTexture("../assets/img/sky/skybox", scene);
skyboxMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.SKYBOX_MODE;
skyboxMaterial.diffuseColor = new BABYLON.Color3(0, 0, 0);
skyboxMaterial.specularColor = new BABYLON.Color3(0, 0, 0);
skybox.material = skyboxMaterial; //限制攝像的視角
camera.upperBetaLimit = Math.PI / 2.2; return scene;
}

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

调整reflectionTexture.coordinatesMode的枚举值,还能产生类似"天空之镜"的效果:

const createScene = () => {
const scene = new BABYLON.Scene(engine); const camera = new BABYLON.ArcRotateCamera("camera", -Math.PI / 3.5, Math.PI / 1.5, 30, new BABYLON.Vector3(0, 0, 0));
camera.upperBetaLimit = Math.PI / 1.5;
camera.attachControl(canvas, true);
const light = new BABYLON.HemisphericLight("light", new BABYLON.Vector3(1, 1, 0)); // Skybox
var skybox = BABYLON.MeshBuilder.CreateBox("skybox", { size: 1000.0 }, scene);
var skyboxMaterial = new BABYLON.StandardMaterial("skybox", scene);
skyboxMaterial.backFaceCulling = false;
skyboxMaterial.reflectionTexture = new BABYLON.CubeTexture("../assets/img/sky/skybox", scene);
skyboxMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.SKYBOX_MODE;
skyboxMaterial.diffuseColor = new BABYLON.Color3(0, 0, 0);
skyboxMaterial.specularColor = new BABYLON.Color3(0, 0, 0);
skybox.material = skyboxMaterial; var shapeMaterial = new BABYLON.StandardMaterial("mat", scene);
shapeMaterial.backFaceCulling = true;
shapeMaterial.reflectionTexture = new BABYLON.CubeTexture("../assets/img/sky/skybox", scene);
//指定为“平面模式”
shapeMaterial.reflectionTexture.coordinatesMode = BABYLON.Texture.PLANAR_MODE;
shapeMaterial.diffuseColor = new BABYLON.Color3(0.1, 0.1, 0.1);
shapeMaterial.specularColor = new BABYLON.Color3(0.1, 0.1, 0.1); // Box
var box = BABYLON.MeshBuilder.CreateBox("box", { size: 5 }, scene);
box.material = shapeMaterial;
box.position.x = -20;
box.rotation.y = Math.PI / 8;
box.rotation.x = -Math.PI / 4; // Sphere
var ball = BABYLON.MeshBuilder.CreateSphere("ball", { diameter: 8 }, scene);
ball.material = shapeMaterial;
ball.position = new BABYLON.Vector3(-5, 2, 5);
ball.rotation.y = Math.PI / 8;
ball.rotation.x = -Math.PI / 8; //Ground
var ground = BABYLON.MeshBuilder.CreateGround("ground", { width: 6, height: 6 }, scene);
ground.material = shapeMaterial;
ground.position = new BABYLON.Vector3(10, 0, 5);
ground.rotation.y = Math.PI / 8;
ground.rotation.x = -Math.PI / 2;
return scene;
}

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

参考文档:

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

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

  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. nndeploy开源推理框架教程来袭,模型推理全流程,轻松上手,一键精通!

    大家好,我们是 nndeploy 开源团队.我们专注于打造一款端到端的模型推理和部署框架 -- nndeploy,旨在为用户提供高效.便捷.灵活且兼容主流框架的模型推理和部署体验. 此次,我们开发了 ...

  2. Stream.findFirst()代替get(0)和数组[0]获取集合中的第一个值

    一.介绍 语法 集合.stream().findFirst() 使用 // 我们的工具类(切割SKU字符串relatedSkuJoin,转为集合).stream.第一个数(): CommonUtils ...

  3. 决策单调性DP

    决策单调性DP是一个非常重要的DP类别.在决策点随枚举点增加单调不降时,可以有效地优化复杂度. 一般而言,决策点指的是对于一个 \(f[i]\),它的值需要从另一个值j中转移,而对于所有j,令 \(f ...

  4. 手把手教你实现MVVM架构

    .markdown-body { color: rgba(89, 89, 89, 1); font-size: 15px; font-family: -apple-system, system-ui, ...

  5. RPC实战与核心原理之流量回放

    流量回放:保障业务技术升级的神器 回顾 时钟轮在 RPC 中的应用,核心原理就一个关键字"分而治之",我们可以把它用在任何需要高效处理大量定时任务的场景中,最具有代表性的就是在高并 ...

  6. AI面试助手“面试精灵”发布新功能——AI笔试助手

    引言 在职场竞争日益激烈的今天,面试已成为决定职业发展的关键一步.许多专业人士虽然在专业领域拥有深厚的知识,却可能缺乏面试技巧.为了帮助这些专业人士更轻松地获得理想的工作,我们推出了革命性的AI面试助 ...

  7. Linux | base64编码与解码命令

    1.base64编码 (1)base64 file 功能:从指定的文件file中读取数据,编码为base64的字符串然后输出: (2)echo "string" | base64 ...

  8. 综述论文解读:Editing Large Language Models: Problems, Methods, and Opportunities

      本文为大语言模型知识编辑综述,发表于自然语言处理顶会ACL(原文链接).由于目前存在广泛的模型编辑技术,但一个统一全面的分析评估方法,所以本文:   1.对LLM的编辑方法进行了详尽.公平的实证分 ...

  9. 爬虫(2)——requests以及xpath的使用

    一.requests requests.request(method,url,**kwargs) # 常见参数 # params/data/json 上传数据 # files 上传文件 # heade ...

  10. java的错误和异常 error和Exception

    error 和 Exception error是由jvm产生的,一般跟我们没有关系, 致命性的 在Exception分支中有一个重要的子类RuntimeException(运行时异常),其他的异常我们 ...