ThingJS场景效果加入新成员—聚光灯

简介: 聚光灯光源从一个点向一个方向发出,沿着一个圆锥,光照越远它的尺寸就越大。ThingJS场景效果加入新成员—聚光灯。

聚光灯光源从一个点向一个方向发出,沿着一个圆锥,光照越远它的尺寸就越大。ThingJS场景效果加入新成员—聚光灯。
光源 (Lights) 是每个场景的重要组成部分。网格和纹理决定了场景的形状和外观,而光源则决定了三维环境的颜色和氛围。您可能会在每个场景中使用多个光源。让它们一起工作需要一些实践,但结果却相当惊人。
1.jpg

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

聚光灯属性介绍

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

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

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

var app = new THING.App({
    url: 'https://www.thingjs.com/static/models/storehouse',
});

// 参数
var dataObj = {
    'type': 'SpotLight',
    'lightAngle': 30,
    'intensity': 1,
    'penumbra': 0.5,
    'castShadow': false,
    'position': null,
    'height': 0,
    'color': 0xFFFFFF,
    'distance': null,
    'target': null,
    'helper': true,
};
// 叉车
let car1;
let car2;
// 当前灯光
let curLight;
let curLightPosition;
// 创建聚光灯方法
function createSpotLight(position, target) {
    dataObj['lightAngle'] = 30;
    dataObj['intensity'] = 0.5;
    dataObj['penumbra'] = 0.5;
    dataObj['castShadow'] = false;
    dataObj['position'] = position;
    dataObj['distance'] = 25;
    dataObj['color'] = 0xFFFFFF;
    dataObj['helper'] = true;
    dataObj['follow'] = false;
    //创建聚光灯
    var spotLight = app.create(dataObj);
    curLight = spotLight;
    curLightPosition = spotLight.position;
    createSpotLightControlPanel(spotLight);
}
……
// 注册鼠标移动事件,检查是否按下'shift'键, 按下设置聚光灯跟随鼠标位置
app.on('mousemove', function (ev) {
    if (!curLight) {
        return;
    }

    if (!ev.shiftKey) {
        return;
    }

    var pickedPosition = ev.pickedPosition;
    if (pickedPosition) {
        curLight.lookAt(pickedPosition);
    }
})
// 注册场景load事件
app.on('load', function (ev) {

    // 主灯强度设置为0,突出聚光灯效果
    app.lighting = {
        mainLight: {
            intensity: 0
        }
    };

    // 获取场景内id为'car01' 和 'car02' 的叉车
    car1 = app.query('car01')[0];
    car2 = app.query('car02')[0];

    // 参数1: 在car2上方5米创建一个聚光灯
    // 参数2: 初始target设置为car1的位置
    createSpotLight(THING.Math.addVector(car2.position, [0, 5, 0]), car1.position);

    // 创建一个圆形路径
    var path = [];
    var radius = 6;
    for (var degree = 0; degree <= 360; degree += 10) {
        var x = Math.cos(degree * 2 * Math.PI / 360) * radius;
        var z = Math.sin(degree * 2 * Math.PI / 360) * radius;
        path.push(THING.Math.addVector(car1.position, [x, 0, z]));
    }
    // 让 car1 沿圆形路径运动
    car1.movePath({
        orientToPath: true, // 物体移动时沿向路径方向
        path: path,
        time: 10 * 1000,
        // 循环类型
        // THING.LoopType.Repeat 不断循环
        // THING.LoopType.PingPong 往复循环
        loopType: THING.LoopType.Repeat
    });
    console.log("按住'shift' 聚光灯可以追踪鼠标位置(开启'跟随物体'后失效)");
})

ThingJS,场景效果基础打好了,让你的项目应用更加轻松!

相关文章
|
文字识别 前端开发
CodeFuse-VLM 开源,支持多模态多任务预训练/微调
随着huggingface开源社区的不断更新,会有更多的vision encoder 和 LLM 底座发布,这些vision encoder 和 LLM底座都有各自的强项,例如 code-llama 适合生成代码类任务,但是不适合生成中文类的任务,因此用户常常需要根据vision encoder和LLM的特长来搭建自己的多模态大语言模型。针对多模态大语言模型种类繁多的落地场景,我们搭建了CodeFuse-VLM 框架,支持多种视觉模型和语言大模型,使得MFT-VLM可以适应不同种类的任务。
1929 0
|
Java 开发者 微服务
Java企业应用软件系统架构演变史
Java企业应用软件系统架构演变史
496 0
|
缓存 移动开发 JavaScript
跨桌面端Web容器演进
随着客户端技术的逐渐发展,Web容器已经深入客户端,为客户端构建了丰富多彩的页面和交互体验,成为客户端的一个不可或缺的重要组成部分。在千牛客户端上,Web容器不仅承载了千牛的开放容器(经历了H5插件到千牛小程序的变革),而且一些核心功能,比如聊天窗口,消息中心,也都是由Web容器承载的。
1788 0
跨桌面端Web容器演进
|
Windows
解决 在配置文件列表中找不到你的默认配置文件-使用第一个配置文件。请进行检查以确保 "defaultProfile" 与你的某个配置文件的 GUID 相匹配
不用 “netsh winsock reset” 命令解决 “在配置文件列表中找不到你的默认配置文件-使用第一个配置文件。请进行检查以确保 "defaultProfile" 与你的某个配置文件的 GUID 相匹配”
解决 在配置文件列表中找不到你的默认配置文件-使用第一个配置文件。请进行检查以确保 "defaultProfile" 与你的某个配置文件的 GUID 相匹配
|
存储 弹性计算 安全
医保行业 | 智慧医保
本文介绍了医保行业 | 智慧医保的方案概述,方案价值及优势以及最佳实践。
医保行业 | 智慧医保
|
4月前
|
域名解析 存储 弹性计算
海宝云-阿里云服务器续费太贵?这有一份不同机型降配与省钱方案的“榨干”测评!
本文由阿里云官方服务商海宝云撰写,直击云服务器续费痛点:新客低价、老客高价。详解三大省钱策略——“续费降配”“跨代降配”“数据迁移”,辅以节省计划、停机模式等隐藏技巧,并提醒缩容、IP变更、共享型风险等避坑要点,助你合法合规砍掉50%~80%续费成本。
|
5月前
|
JSON BI 调度
Python + 大模型行业资讯自动化摘要流水线完整工程实现方案
Python + 大模型行业资讯自动化摘要流水线完整工程实现方案
|
6月前
|
小程序 前端开发
互联网医院 APP / 小程序开发:医保、支付、HIS 系统对接实践
互联网医院开发难点不在界面,而在系统协同:HIS对接需适配多源异构数据,医保接口要求高稳定性与强事务控制,支付模块须深度绑定业务状态。核心在于解耦设计、状态精准流转与异常补偿机制,确保多系统长期稳定协同。
|
7月前
|
监控 Java 数据库连接
Java 线程池核心参数设计与生产环境调优实战
本文系统解析Java线程池核心原理:详解七大参数(corePoolSize、maximumPoolSize等)、执行流程、队列类型选择及拒绝策略;深入讲解生产环境动态调优方法,含Spring Boot实战代码;并提供线程泄露与任务堆积的排查思路、工具及解决方案。
614 3
|
7月前
|
编解码 数据可视化 BI
Python 实现 Excel 数据可视化:柱状图制作教程
本文以运营人员小张的痛点切入,介绍如何用Python(pandas+matplotlib+openpyxl)自动化生成Excel销售柱状图。涵盖读取数据、绘制普通/堆叠/横向柱状图、美化样式、批量处理多文件、嵌入图表到Excel等实用技巧,助你将半小时手工操作压缩至十秒,实现高效、统一、可复用的数据可视化。(239字)
838 1