如何控制楼层的层级效果?比如进入楼层展开楼层?三维可视化园区中该怎么去访问对象?又是如何让场景显示和隐藏的呢?在ThingJS物联网可视化开发平台中,ThingJS提供了控制场景的方法,让我们来看看它是如何控制的吧!
ThingJS官方示例中按分类访问对象,使用全局APP对象,通过forEach函数遍历园区中所有对象,并且打印出对象的id属性。 /** * 说明:通过 “分类对象属性树” 访问场景内的对象 * 操作:无,查看log信息 * 教程:ThingJS 教程——>园区与层级——>场景层级 * 难度:★★☆☆☆ */ var app = new THING.App({ }); // 加载场景后执行 app.on('load', function (ev) { // 获取园区对象 var campus = ev.campus; // 打印园区内的 Thing 物体 campus.things.forEach(function (thing) { console.log('Thing: ' + thing.id); }); // 获取园区下的建筑对象 var buildings = campus.buildings; buildings.forEach(function (building) { console.log('Building: ' + building.id); }); // 打印第一个建筑中所有的楼层 buildings[0].floors.forEach(function (floor) { console.log('Floor: ' + floor.id); }); });
/** * 说明:通过 “父子树” 访问场景内的对象 * 操作:无,查看log信息 * 教程:ThingJS 教程——>园区与层级——>场景层级 * 难度:★★☆☆☆ */ var app = new THING.App({ }); // 加载场景后执行 app.on('load', function (ev) { // 获取园区对象 var campus = ev.campus; // 通过场景的 父子树 访问对象 var children = campus.children; for (var i = 0; i < children.length; i++) { var child = children[i]; var id = child.id; var name = child.name; var type = child.type; console.log('id: ' + id + ' name: ' + name + ' type: ' + type); } // id 107 为白色厂区建筑, // parent: app.query('107')[0] 为在厂区内创建物体 // 厂区内创建的物体,只有在进入厂区后才会能显示,点击厂区进入,则看到绿色小车 // 当推出厂区后,绿色小车则隐藏 var obj = app.create({ type: 'Thing', id: 'No1234567', name: 'truck', parent: app.query('107')[0], position: [0, 0, 0], // 世界坐标系下的位置 complete: function (ev) { //物体创建成功以后执行函数 console.log('thing created: ' + ev.object.id); } }); var campus = ev.campus; console.log('after load ' + campus.id); // 切换层级到园区 app.level.change(campus); });
ThingJS通过THING.widget.Button方法来创建按钮,通过query方法来查询,括号内可以是id也可以是name。具体如何使用可以查看API。 /** * 说明:演示场景层级切换的相关API * 操作: * 园区加载完成 将层级设置为园区后 开启了系统的层级控制 * 点击「进入楼层」「进入书柜」跳转到相应层级 * 点击「返回上一级」返回到上一层级 * 教程:ThingJS教程——>园区与层级——>如何切换层级 * 难度:★★☆☆☆ */ var app = new THING.App({ skyBox: 'Night' }); app.on('load', function (ev) { // 场景加载完成后 进入园区层级 开启默认的层级控制 app.level.change(ev.campus); new THING.widget.Button('进入楼层', function () { // 通过name查询得到楼层 var obj = app.query('108')[0]; // 将层级切换到楼层 app.level.change(obj); }); new THING.widget.Button('进入书柜', function () { // 通过name查询得到书柜 var obj = app.query('cabinetB4')[0]; // 将层级切换到书柜 app.level.change(obj); }); new THING.widget.Button('返回上一级', function () { // 返回上一层级 app.level.back(); }); });
在ThingJS中,使用building.floors.visible方法控制楼层是否可见,使用isHorzMode、isHideRoof 属性来控制水平或者垂直展开。 /** * 说明:楼层展开和恢复功能 * 操作:点击按钮和选择框 */ var app = new THING.App({ }); // 加载场景后执行 var building = null; app.on('load', function (ev) { building = ev.buildings[0]; new THING.widget.Button('楼层展开', test_expand); new THING.widget.Button('楼层合并', test_unexpand); }); // 水平展开或垂直展开(可尝试修改后运行看效果) var isHorzMode = false; // 展开楼层时是否隐藏天花板 var isHideRoof = true; // 展开建筑楼层 function test_expand() { // 在园区层级下 建筑内的楼层默认是隐藏的 // 因此 在园区层级下 展开楼层需设置该建筑下的楼层可见 building.floors.visible = true; // 隐藏建筑的外立面 building.facades.visible = false; building.expandFloors({ 'time': 1000, 'distance': isHorzMode ? -30 : 10, 'horzMode': isHorzMode, 'hideRoof': isHideRoof, 'complete': function () { console.log('expand complete '); } }); } // 恢复建筑楼层 function test_unexpand() { building.unexpandFloors({ 'time': 500, 'complete': function () { building.floors.visible = false; building.facades.visible = true; console.log('unexpand complete '); } }); }
看到这写代码是不是觉得很简单?很多人都会拿threejs来横向对比ThingJS,夸奖threejs不但免费而且功能强大,但是实际上呢?两者的面向群众是不尽相同的铲子和挖掘机都能挖地,那是不是就不要铲子了呢?这个比喻虽然不恰当,但也说明了这一点,threejs免费、开源,全球都有许多人使用,人群广,技术更是层层推进,制作一个简单的方盒子都需要近百行代码,因为它“要求更高”!threejs更适合那些3D爱好者和民间大神去使用,而ThingJS的定位就是,给前端工程师看看,一周内就能上手开发项目的,ThingJS更偏向于项目的制作与交付,说白了,一个是理想主义者(threejs),而一个是现实主义者(thingjs),追求更精密的操作,更加高大上的效果,建议使用threejs或者是其他免费开源的软件,而要是进行项目一级的制作,需要进行交付等等,那么使用ThingJS,反而是一个更好的选择。 |