ThingJS:如何基于JS语法来设置聚光灯功能

SpotLight聚光灯具有锥形效果的光源,可以产生阴影,类似我们日常生活中的手电筒。ThingJS如何基于JS语法来设置聚光灯功能呢? 光源 (Lights) 是每个场景的重要组成部分。网格和纹理决定了场景的形状和外观,而光源则决定了三维环境的颜色和氛围。您可能会在每个场景中使用多个光源。让它们一起工作需要一些实践,但结果却相当惊人。 1.jpg

ThingJS 提供一个模拟手电筒、车灯、等线性光照效果的光源—聚光灯,从一个点向锥形范围内发射光线,官方类型是spotlight。 聚光灯是3D世界中的一种光源类型,其灯光从一点发出,沿着某一个方向照射出一个锥形光照范围。聚光灯近似于一个有夹角范围限定的点光源。聚光灯可用于模拟舞台、汽车车头灯,手电筒,台灯等光源效果,可添加至3D容器、摄像机等对象下方,对其中所有对应的对象生效。

聚光灯属性介绍

灯光角度 聚光灯的灯光聚光角度。 亮度 光线的明亮程度。 半影 投射光线边缘的虚化,默认为0,不模糊。 距离 光源照射的距离。默认为0,如果为0,表示光源不受距离影响,可照射至无穷远。 高度 光源照射的高度。聚光灯有方向和位置,并且以圆锥的形状制造灯光。 影子 光源被物体所遮蔽而产生阴影效果,默认关闭。 辅助线 默认显示。这种灯光从一点发出,在一个方向按照—个锥形的范围照射,呈现圆锥的形状。 跟随物体 通过设定追踪对象,可将该聚光灯设定为追光灯。 颜色 光线的颜色,对象的颜色受光线颜色影响。 2.png

3dmax之中,聚光灯是室内打光的基础,这种类型的3dmax灯光可以方便我们快速提亮目标区域的亮度,如果目标物体是动态的呢?官方采用JS mousemove鼠标移动事件来实现目标物体运动。 mousemove 事件是一个实时响应的事件,当鼠标指针的位置发生变化时(至少移动一个像素),就会触发 mousemove 事件。该事件响应的灵敏度主要参考鼠标指针移动速度的快慢以及浏览器跟踪更新的速度。官方在物体上方5米创建一个聚光灯,并让物体沿着路径方向不断循环,实现“跟随物体”的聚光灯效果。光打在了移动的物体上,照射范围和角度随着物体移动变化而变化。

跟随物体的聚光灯代码示例如下。完整版请登录ThingJS平台-场景效果-聚光灯查看。

1var app = new THING.App({ 2 url: 'https://www.thingjs.com/static/models/storehouse', 3}); 4 5// 参数 6var dataObj = { 7 'type': 'SpotLight', 8 'lightAngle': 30, 9 'intensity': 1, 10 'penumbra': 0.5, 11 'castShadow': false, 12 'position': null, 13 'height': 0, 14 'color': 0xFFFFFF, 15 'distance': null, 16 'target': null, 17 'helper': true, 18}; 19// 叉车 20let car1; 21let car2; 22// 当前灯光 23let curLight; 24let curLightPosition; 25// 创建聚光灯方法 26function createSpotLight(position, target) { 27 dataObj['lightAngle'] = 30; 28 dataObj['intensity'] = 0.5; 29 dataObj['penumbra'] = 0.5; 30 dataObj['castShadow'] = false; 31 dataObj['position'] = position; 32 dataObj['distance'] = 25; 33 dataObj['color'] = 0xFFFFFF; 34 dataObj['helper'] = true; 35 dataObj['follow'] = false; 36 //创建聚光灯 37 var spotLight = app.create(dataObj); 38 curLight = spotLight; 39 curLightPosition = spotLight.position; 40 createSpotLightControlPanel(spotLight); 41} 42…… 43// 注册鼠标移动事件,检查是否按下'shift'键, 按下设置聚光灯跟随鼠标位置 44app.on('mousemove', function (ev) { 45 if (!curLight) { 46 return; 47 } 48 49 if (!ev.shiftKey) { 50 return; 51 } 52 53 var pickedPosition = ev.pickedPosition; 54 if (pickedPosition) { 55 curLight.lookAt(pickedPosition); 56 } 57}) 58// 注册场景load事件 59app.on('load', function (ev) { 60 61 // 主灯强度设置为0,突出聚光灯效果 62 app.lighting = { 63 mainLight: { 64 intensity: 0 65 } 66 }; 67 68 // 获取场景内id为'car01' 和 'car02' 的叉车 69 car1 = app.query('car01')[0]; 70 car2 = app.query('car02')[0]; 71 72 // 参数1: 在car2上方5米创建一个聚光灯 73 // 参数2: 初始target设置为car1的位置 74 createSpotLight(THING.Math.addVector(car2.position, [0, 5, 0]), car1.position); 75 76 // 创建一个圆形路径 77 var path = []; 78 var radius = 6; 79 for (var degree = 0; degree <= 360; degree += 10) { 80 var x = Math.cos(degree * 2 * Math.PI / 360) * radius; 81 var z = Math.sin(degree * 2 * Math.PI / 360) * radius; 82 path.push(THING.Math.addVector(car1.position, [x, 0, z])); 83 } 84 // 让 car1 沿圆形路径运动 85 car1.movePath({ 86 orientToPath: true, // 物体移动时沿向路径方向 87 path: path, 88 time: 10 * 1000, 89 // 循环类型 90 // THING.LoopType.Repeat 不断循环 91 // THING.LoopType.PingPong 往复循环 92 loopType: THING.LoopType.Repeat 93 }); 94 console.log("按住'shift' 聚光灯可以追踪鼠标位置(开启'跟随物体'后失效)"); 95})

ThingJS,不仅仅是JS开发专家,也是基于JS开发3D炫酷场景的行家!

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Android So动态加载 优雅实现与原理分析

背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我