本帖最后由 张唯威 于 2022-10-31 11:23 编辑
室内外切换时更换模板是监听层级事件,进入室内和退出室内时切换模板,示例代码如下: - app.on(THING.EventType.EnterLevel, '.Building', function(ev) {
- if (ev.previous._type === 'Campus') {
- // 进入室内,切换为另外一个模板
- modelData = deepClone(data1); // 模板数据
- modelDataUrl = 'https://www.thingjs.com/uploads/wechat/364422/file/园区模板/campusModelB/'; // 模板包地址
- removeModel(); // 移除模板
- initEffectThemeControl(modelData, modelDataUrl); // 应用模板
- }
- });
- app.on(THING.EventType.EnterLevel, '.Campus', function(ev) {
- if (ev.previous && ev.previous._type === 'Building') {
- // 退出室内,室外切换为原前模板
- modelData = deepClone(data); // 模板数据
- modelDataUrl = 'https://www.thingjs.com/uploads/wechat/364422/file/园区模板/campusModelA/'; // 模板包地址
- removeModel(); // 移除模板
- initEffectThemeControl(modelData, modelDataUrl); // 应用模板
- }
- });
复制代码 园区效果模板的切换、开启和关闭效果模板、开启和关闭特效地面、开启和关闭特效粒子详细代码如下:
- let ctrl = null; // 模板控制器
- let campus = null; // 园区对象
- let lighting = null; // 灯光效果
- let postEffect = null; // 后期设置
- let skyEffect = null; // 天空盒
- let background = null; // 背景
- let modelData = null; // 模板数据
- let modelDataUrl = ''; // 模板路径
- let tempData = null; // 临时模板数据,在关闭模板后,再次开启效果时调用
- let tempUrl = ''; // 临时模板路径,在关闭模板后,再次开启效果时调用
- let groundVisible = true; // 特效地面是否显示
- let particleVisible = true; // 特效粒子是否显示
- const app = new THING.App({
- url: '/api/scene/7ccb8574cf69076e83a28e30', // 园区路径
- });
- // 引入模板数据
- THING.Utils.dynamicLoad(['/uploads/wechat/364422/file/园区模板/EffectThemeControl.js',
- '/uploads/wechat/364422/file/园区模板/campusModelA/frame.js',
- '/uploads/wechat/364422/file/园区模板/campusModelB/frame.js'
- ], function () {
- app.on('load', function (ev) {
- // 存储园区加载时的灯光效果、后期设置、天空盒或者背景
- lighting = deepClone(app.lighting);
- postEffect = deepClone(app.postEffect);
- skyEffect = deepClone(app.skyBox);
- background = app.background;
-
- app.level.change(ev.campus);
- // 关闭,进到室内自动切换天空盒
- app.level.options['autoChangeBackground'] = false;
- // 初始化
- let control = new THING.EffectThemeControl();
- app.addControl(control, '效果模板控制器');
- // 获取模板控制器
- ctrl = app.getControl('效果模板控制器');
- });
- THING.widget.Button('模板A', function () {
- // 效果模板A,由于底层会对数据更改,数据入参需深拷贝,但最好是由底层对入参进行深拷贝处理
- modelData = deepClone(data); // 模板数据
- tempData = deepClone(data);// 模板数据
- modelDataUrl = 'https://www.thingjs.com/uploads/wechat/364422/file/园区模板/campusModelA/'; // 模板包地址
- tempUrl = 'https://www.thingjs.com/uploads/wechat/364422/file/园区模板/campusModelA/'; // 模板包地址
- removeModel(); // 移除模板
- initEffectThemeControl(modelData, modelDataUrl); // 应用模板
- });
- THING.widget.Button('模板B', function () {
- // 效果模板B
- modelData = deepClone(data1); // 模板数据
- tempData = deepClone(data1);// 模板数据
- modelDataUrl = 'https://www.thingjs.com/uploads/wechat/364422/file/园区模板/campusModelB/'; // 模板包地址
- tempUrl = 'https://www.thingjs.com/uploads/wechat/364422/file/园区模板/campusModelB/'; // 模板包地址
- removeModel(); // 移除模板
- initEffectThemeControl(modelData, modelDataUrl); // 应用模板
- });
- THING.widget.Button('模板效果开', function () {
- // 开启模板效果
- showModel(true);
- });
- THING.widget.Button('模板效果关', function () {
- // 关闭模板效果
- showModel(false);
- });
- THING.widget.Button('特效地面', function () {
- // 开启特效地面
- showGround();
- });
- THING.widget.Button('粒子模型', function () {
- // 开启粒子模型
- showParticle();
- });
-
- });
- // 模板数据注册和应用
- function initEffectThemeControl(modelData, modelDataUrl) {
- // 注册模板,modelData是模板数据。如果是本地效果模板包,必须填第三个参数modelDataUrl,该参数是模板包相对于该片代码的路径,default自定义名字
- ctrl.registerTheme('default', modelData, modelDataUrl);
- // 获取园区
- campus = app.query('.Campus')[0];
- // 应用效果模板
- campus.applyTheme('default'); // class等
- ctrl.applyEffectTheme('default', campus); // 特效地面和粒子
- ctrl.applyThemeEnvironment('default', campus); // 环境和灯光
- }
- // 开启和关闭模板效果
- function showModel (boolean) {
- if (boolean) {
- // 开启
- modelData = deepClone(tempData); // 模板数据
- modelDataUrl = tempUrl; // 模板路径
- initEffectThemeControl(modelData, modelDataUrl); // 引用模板
- } else {
- // 关闭
- removeModel(); // 销毁模板
- // 关闭效果模板后全局参数设置为默认的
- globalEffectConfig(lighting, postEffect, skyEffect, background);
- }
- }
- // 全局效果配置参数
- function globalEffectConfig(config, effectConfig, skyBox, background) {
- app.lighting = config; // 灯光效果
- app.postEffect = effectConfig; // 后期设置
- app.skyBox = skyBox; // 天空盒
- app.background = background; // 背景
- }
- // 特效地面开关
- function showGround () {
- groundVisible = !groundVisible;
- app.query('.GroundObject').visible = groundVisible;
- }
- // 特效粒子开关
- function showParticle () {
- particleVisible = !particleVisible;
- app.query('.ParticleSystem').visible = particleVisible;
- }
- function removeModel () {
- // 销毁效果模板
- if (THING.ThemeManager.findStyle('default')) {
- ctrl.destroyEffectTheme('default', campus);
- campus.applyTheme(null);
- // 清除全局参数背景和天空盒
- app.skyBox = null;
- app.background = null;
- }
- }
- // 深拷贝
- function deepClone(params) {
- return JSON.parse(JSON.stringify(params));
- }
复制代码
|
|
|
|
|
|