可视化前端开发对技术的要求

前端工程师的职位我是觉得真心不错的,但有的前端工程师野心很大呀,不甘于只写页面代码,还要往更好的方向发展,比如可视化方向。3D可视化已经被越来越多人、企业了解和应用起来。那你知道对于可视化前端开发有什么样的技术要求吗?其实不难。一切都借助于平台开发,thingjs平台简化webgl、封装threejs,只需要前端有一定的开发经验,熟练掌握Javascript语言就行啦~简单拖拽,写一些代码就可以实现3D可视化应用开发。

可视化前端开发对技术的要求

thingjs-面向物联网的3D可视化开发平台

/**

* 说明:

* 自定义层级切换效果 例如

* 进入建筑层级摊开楼层

* 进入楼层层级更换背景图 等

*

* 操作:

* 关闭自定义层级控制时 层级切换执行系统内置的响应

* 开启自定义层级控制时 层级切换执行自定义的效果

*

* 难度:★★★★☆

* 预备知识:场景层级、层级切换、事件(注册、暂停、恢复、卸载)

*/

var app = new THING.App({

    url: 'https://www.thingjs.com/static/models/storehouse',

    skyBox: 'Night'

});

// 初始化完成后开启场景层级

var campus;

app.on('load', function (ev) {

    campus = ev.campus;

    // 将层级切换到园区 开启场景层级

    app.level.change(ev.campus);

    createWidget();

});

function createWidget() {

    // 界面组件

    var panel = new THING.widget.Panel();

    var customLevelControl = panel.addBoolean({ 'isEnabled': false }, 'isEnabled').caption('自定义层级控制');

    customLevelControl.on("change", function (ev) {

        app.level.change(campus);

        var isEnabled = ev;

        if (isEnabled) {

            console.log('启用自定义层级控制');

            enableCustomLevelChange();

        }

        else {

            console.log('恢复默认层级控制');

            disableCustomLevelChange();

        }

    });

}

function enableCustomLevelChange() {

    //  暂停默认退出园区行为

    app.pauseEvent(THING.EventType.LeaveLevel, '.Campus', THING.EventTag.LevelSceneOperations);

    // 进入建筑摊开楼层

    app.on(THING.EventType.EnterLevel, '.Building', function (ev) {

        var previous = ev.previous;

        console.log('从' + previous.type + '进入建筑');

        ev.current.expandFloors({

            'time': 1000,

            'complete': function () {

                console.log('ExpandFloor complete ');

            }

        });

    }, 'customEnterBuildingOperations');

    // 进入建筑保留天空盒

    app.pauseEvent(THING.EventType.EnterLevel, '.Building', THING.EventTag.LevelSetBackground);

    //  修改进入建筑层级选择设置

    app.on(THING.EventType.EnterLevel, '.Building', function (ev) {

        var curBuilding = ev.current;

        app.picker.pickedResultFunc = function (object) {

            var parents = object.parents;

            for (var i = 0; i < parents.length; i++) {

                var parent = parents[i];

                // 如果被Pick物体的父亲是当前层级(Building)就返回被Pick的物体

                if (parent == curBuilding) {

                    return object;

                }

                if (curBuilding.children.includes(parent)) {

                    // return parent;

                    return object;

                }

            }

        }

    }, 'customLevelPickedResultFunc');

    // 暂停建筑层级的默认选择行为

    app.pauseEvent(THING.EventType.EnterLevel, '.Building', THING.EventTag.LevelPickedResultFunc);

    //  退出建筑关闭摊开的楼层

    app.on(THING.EventType.LeaveLevel, '.Building', function (ev) {

        var current = ev.current;

        console.log('退出建筑,进入' + current.type);

        ev.object.unexpandFloors({

            'time': 500,

            'complete': function () {

                console.log('Unexpand complete ');

            }

        });

    }, 'customLeaveBuildingOperations');

    // 进入楼层设置背景

    app.on(THING.EventType.EnterLevel, '.Floor', function (ev) {

        var previous = ev.previous;

        console.log('从' + previous.type + '进入楼层');

        if (previous instanceof THING.Building) {

            // 从建筑进入楼层时

            app.background = '/uploads/wechat/emhhbmd4aWFuZw==/file/img/bg_grid.png';

        }

    }, 'setFloorBackground');

    app.pauseEvent(THING.EventType.EnterLevel, '.Floor', THING.EventTag.LevelSetBackground);

    // 退出楼层设置背景

    app.on(THING.EventType.LeaveLevel, '.Floor', function (ev) {

        var current = ev.current;

        console.log('退出楼层,进入' + current.type);

        if (current instanceof THING.Building) {

            // 从楼层退出到建筑时

            app.background = null;

            app.skyBox = "Night";

        }

    }, 'customLeaveFloorOperations');

    //  修改进入层级场景响应

    // * @property {Object} ev 进入物体层级的辅助数据

    // * @property {THING.BaseObject} ev.object 当前层级

    // * @property {THING.BaseObject} ev.current 当前层级

    // * @property {THING.BaseObject} ev.previous 上一层级

    app.on(THING.EventType.EnterLevel, '.Thing', function (ev) {

        var object = ev.object;

        // 其他物体渐隐

        var things = object.brothers.query('.Thing');

        things.fadeOut();

        // 尝试播放动画

        if (object.animationNames.length) {

            object.playAnimation({

                name: object.animationNames[0],

            });

        }

    }, 'customEnterThingOperations');

    //  停止进入物体层级的默认行为

    app.pauseEvent(THING.EventType.EnterLevel, '.Thing', THING.EventTag.LevelSceneOperations);

    app.on(THING.EventType.LeaveLevel, '.Thing', function (ev) {

        var object = ev.object;

        // 其他物体渐现

        var things = object.brothers.query('.Thing');

        things.fadeIn();

        // 反播动画

        if (object.animationNames.length) {

            object.playAnimation({

                name: object.animationNames[0],

                reverse: true

            });

        }

    }, 'customLeaveThingOperations');

}

function disableCustomLevelChange() {

    app.resumeEvent(THING.EventType.LeaveLevel, '.Campus', THING.EventTag.LevelSceneOperations);

    app.resumeEvent(THING.EventType.EnterLevel, '.Building', THING.EventTag.LevelSetBackground);

    app.resumeEvent(THING.EventType.EnterLevel, '.Building', THING.EventTag.LevelPickedResultFunc);

    app.resumeEvent(THING.EventType.EnterLevel, '.Floor', THING.EventTag.LevelSetBackground);

    app.resumeEvent(THING.EventType.EnterLevel, '.Thing', THING.EventTag.LevelSceneOperations);

    app.off(THING.EventType.EnterLevel, '.Building', 'customEnterBuildingOperations');

    app.off(THING.EventType.EnterLevel, '.Building', 'customLevelPickedResultFunc');

    app.off(THING.EventType.LeaveLevel, '.Building', 'customLeaveBuildingOperations');

    app.off(THING.EventType.EnterLevel, '.Floor', 'setFloorBackground');

    app.off(THING.EventType.LeaveLevel, '.Floor', 'customLeaveFloorOperations');

    app.off(THING.EventType.EnterLevel, '.Thing', 'customEnterThingOperations');

    app.off(THING.EventType.LeaveLevel, '.Thing', 'customLeaveThingOperations');

    var curLevel = app.level.current;

    app.background = 'rgb(144,144,144)';

    if (curLevel instanceof THING.Building) {

        curLevel.unexpandFloors({

            'time': 500,

            'complete': function () {

                console.log('Unexpand complete ');

            }

        });

    }

}

现在你了解了吗?3D可视化应用开发对于前端工程师的要求真心不高,只要你静下心来研究开发平台,多看看教程就能行,建议大家试一试~