村子里的常年灯光会让睡眠变得非常困难,所以我们将通过关灯来介绍夜间。当然,人们不想在晚上完全黑暗中行走,所以我们将添加一些路灯。由于永恒的夜晚并不比永恒的白天好,我们将添加一个界面来从一个转换到另一个。我们想晚上关灯,白天开灯。让我们添加一个 GUI 控件来执行此操作。有光的地方也有阴影,Babylon.js 也可以添加它们。

到目前为止,我们只是在所有场景中使用了半球光。有一系列灯,但目前我们将介绍的唯一新灯是聚光灯。这可以放置在任何地方,并给出一个发光的方向。光的传播由以弧度为单位的角度给出,角度越大传播越广。最后一个参数表示光线消失的速度,数字越大,光线照射的距离越短。可以为聚光灯赋予颜色。

我们将为路灯添加聚光灯。为了创建灯柱,我们引入了另一种通过沿路径挤出形状来创建网格的方法。

我们创建形状轮廓以仅使用 x、y 平面中的点通过一系列 vector3 进行挤出。

然后我们再次使用 vector3s 设置挤出路径。路径不必限于 x、y 平面,它可以使用完整的 3D 空间进行描述。

为了使灯光更明显,我们调低了半球光的强度。

//创建聚光灯,
//参数1: 名字
//参数2: 位置
//参数3: 方向
//参数4: 角度
//参数5: 光线传播的距离
const lampLight = new BABYLON.SpotLight("name", position, direction, angle of spread, speed of disipation);//设置聚光灯颜色
lampLight.diffuse = BABYLON.Color3.Yellow();//设置路灯的灯的形状
const lampShape = [];
for(let i = 0; i < 20; i++) {lampShape.push(new BABYLON.Vector3(Math.cos(i * Math.PI / 10), Math.sin(i * Math.PI / 10), 0));}
lampShape.push(lampShape[0]); //close shape//设置路灯的灯杆形状
const lampPath = [];
lampPath.push(new BABYLON.Vector3(0, 0, 0));
lampPath.push(new BABYLON.Vector3(0, 10, 0));
for(let i = 0; i < 20; i++) {lampPath.push(new BABYLON.Vector3(1 + Math.cos(Math.PI - i * Math.PI / 40), 10 + Math.sin(Math.PI - i * Math.PI / 40), 0));
}
lampPath.push(new BABYLON.Vector3(3, 11, 0));//网格创建器生成路灯的形状
const lamp = BABYLON.MeshBuilder.ExtrudeShape("lamp", {cap: BABYLON.Mesh.CAP_END, shape: lampShape, path: lampPath, scale: 0.5});//让主光源的强度减弱
light.intensity = 0.5;

现在,我们想要通过UI空间控制小镇从白天到夜晚。

UI控件-滑块

将图形用户界面添加到场景的一种有用方法是 Babylon.js GUI。在虚拟现实中工作时,此 GUI 是必需的,因为它被设计为位于 Babylon.js 场景画布内,而不是 HTML 文档的一部分。此 GUI 已预加载到操场中,但它是一个附加脚本,可加载到您自己的项目中

<script>https://cdn.babylonjs.com/gui/babylon.gui.min.js</script>

对于村庄世界,我们将使用一个包含两个 GUI 元素的 GUI 堆栈面板。标题的文本块和通过设置光强度来改变白天到黑夜和返回的滑块。

我们需要做的第一件事是创建一个特殊的纹理,称为AdvancedDynamicTexture,GUI 元素将在其上绘制。

对于我们的世界,GUI 将是基于全屏的。

我们创建容器面板来保存屏幕右下角的其他元素。然后将其添加到高级动态纹理中。

创建文本块,滑块并将其添加到面板。

向滑块添加一个 observable 事件以更改光强度。

//特殊纹理,高级动态纹理,GUI元素在上面绘制。
const adt = BABYLON.GUI.AdvancedDynamicTexture.CreateFullscreenUI("UI");//创建GUI面板设置位置
const panel = new BABYLON.GUI.StackPanel();
panel.width = "220px";
panel.top = "-50px";
panel.horizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_RIGHT;
panel.verticalAlignment = BABYLON.GUI.Control.VERTICAL_ALIGNMENT_BOTTOM;
adt.addControl(panel);//创建文本
const header = new BABYLON.GUI.TextBlock();
header.text = "Night to Day";
header.height = "30px";
header.color = "white";
panel.addControl(header);//创建滑动条
const slider = new BABYLON.GUI.Slider();
slider.minimum = 0;
slider.maximum = 1;
slider.borderColor = "black";
slider.color = "#AAAAAA";
slider.background = "#white";
slider.value = 1;
slider.height = "20px";
slider.width = "200px";
panel.addControl(slider);//监听滑块回调
slider.onValueChangedObservable.add((value) => {if (light) {light.intensity = value;}
});

现在可以模拟白天到晚上光线变化的过程了,

但现在光还无法产生阴影,显得不真实。

添加阴影

到目前为止,我们一直使用的光HemisphericLight提供环境背景光,不适合产生阴影。我们可以使用聚光灯,但是它们产生的阴影可能很微弱,因此我们将引入定向光。

像往常一样,方向是一个vector3,场景参数是可选的。

const  light = new BABYLON.DirectionalLight("dir", direction, scene);

设置其位置将影响任何创建的阴影的方向和长度。

light.position = new BABYLON.Vector3(0, 15, -30);

阴影只会在创建ShadowGenerator对象时出现,给定一个投射阴影的网格,并且将投射阴影的网格设置为接收阴影。

const shadowGenerator = new BABYLON.ShadowGenerator(1024, light);

第一个参数是阴影贴图的大小和产生阴影的灯光。

我们还需要添加一个可以投射阴影的网格。

shadowGenerator.addShadowCaster(casting mesh, true);

可选的第二个参数,其默认值为 false,会将网格的任何子项添加到阴影投射器。

最后,我们还必须告诉投射阴影的网格来接收它。

const shadowGenerator = new BABYLON.ShadowGenerator(1024, light);shadowGenerator.addShadowCaster(dude, true);ground.receiveShadows = true;

现在可以成功的产生阴影。

但我们看世界的方式,还可以扩展更多。

Babylongjs-光源,阴影相关推荐

  1. 【Unity 手写PBR】补充:多光源 阴影 视差 自发光

    写在前面 [Unity 手写PBR]Build-in管线:实现直接光部分 [Unity 手写PBR]Build-in管线:实现间接光部分 这里再快速补充一下剩下的部分,多光源.阴影.视差贴图应用和自发 ...

  2. OpenGL基础54:点光源阴影

    前置: OpenGL基础53:阴影映射(下) 一.万象阴影贴图 之前成功实现了平行光阴影,生成阴影贴图时使用的矩阵是正交矩阵,若是想要实现点光源的阴影效果,那么理论上只需要修改投影矩阵为透视矩阵就好了 ...

  3. 15.真实感图形——光照与明暗+光线跟踪+纹理映射+辐射度方法+阴影

    ♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥,.*,.♥♥,.*,.♥,.*,.♥,.*,.♥,.*♥,.*,.♥,.*,.♥ ...

  4. Three.js光源梳理3——平行光(DirectionalLight)

    平行光本质是一个方向向量,在shader中计算时直接与模型顶点的法线方向进行dot点乘操作. 如果L(平行光)的向量与N(顶点法线方向)一样(N Dot L=1),那么表示模型的这个点正对着光源,应该 ...

  5. Three.js-灯光与阴影

    目录 1.常见的光源类型 1.1 环境光(AmbientLight) 1.1.1 构造函数 1.1.2 属性 1.1.3 方法 1.1.4 环境光效果 1.2 平行光(DriectionalLight ...

  6. 6 Babylonjs基础入门 光源

    光源会在照射方式和颜色方面影响模型网格的显示效果.除非你开启阴影效果,要不然光线可以穿透所有的网格.场景默认的光源数量为4个,可以通过修改增加. 光源的类型 在Babylon.js中,有四种光源的类型 ...

  7. 可编程渲染管线4 聚光灯阴影

    原文:https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/spotlight-shadows/ 读取并渲染纹理 从 ...

  8. Unity可编程渲染管线系列(四)聚光灯阴影(阴影贴图)

    目录 1 一个带有阴影的聚光灯 1.1 阴影贴图 1.2 阴影命令缓冲区 1.3 设置 渲染目标 1.4 配置视图和投影矩阵 1.5 渲染阴影投射器 2 阴影投射器通道 2.1 阴影包含文件 2.2 ...

  9. Unity Shader 阴影系列(1)--内置阴影处理

    阴影效果以及手机端阴影处理 什么是阴影 Unity中如何模拟阴影 上面的说的就是ShadowMap技术 屏幕空间阴影 Unity深度图的获取 对比分析 shadowmap的弊端 Shadow acne ...

  10. Unity SRP自定义渲染管线 -- 5.Directional Shadows

    原文:https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/directional-shadows/ 支持多个方向光 ...

最新文章

  1. 2022-2028年中国金属薄膜行业市场深度监测及投资潜力研究报告
  2. Java jar 如何防止被反编译?代码写的太烂,害怕被人发现
  3. 自学python需要买书吗-Python入门到精通学习书籍推荐!
  4. 有没有插件_这 10 款插件让你的 GitHub 更好用、更有趣
  5. Android中保存数据的三种方法
  6. acwing2019. 拖拉机(最短路径)
  7. Tipard Video Converter Ultimate如何旋转视频?
  8. pythongui 三维_python图形GUI基本示例
  9. Objective-C MVC
  10. 开发本无趣,看 Unity 如何为其绽放精彩!
  11. matlab结构体构建,matlab 怎么建立结构体数组?
  12. 使用keras创建自己的图像标题生成器
  13. 数理统计中的卡方分布,t分布和F分布
  14. 我的世界服务器物品锁bug,【MOD教程】已知MOD服BUG物品解析
  15. 一个案例入门tableau——NBA球队数据可视化实战解析
  16. SMAP土壤湿度数据的下载与hdf-tif转格式
  17. 手动档科目三考试过程
  18. Debian系安装rabbitmq
  19. JSK-107305丨ICPC焦作站网赛 B丨dp
  20. 力扣(15.18)补9.19

热门文章

  1. 多事之秋:不怕贼偷,就怕惦记
  2. 互联网公司招聘了“程序员鼓励师”程序员们敢享 受吗?
  3. 求三角锥体积用c语言,求三角锥体积公式的推导?
  4. 第二模块:试用期问题深度剖析
  5. 怎样便捷的退出iphone的恢复模式
  6. 计算机组成原理复习资料
  7. 网站日志分析工具汇总
  8. fatal error: THC/THC.h: No such file or directory
  9. 【Unity2D入门教程】简单制作战机弹幕射击游戏② C#编写 Player和Enemy脚本
  10. 数据治理专业认证CDMP学习笔记(思维导图与知识点)- 第八章数据集成和互操作篇...