50代码HTML5 Canvas 3D 编辑器优雅搞定

liuwei000000 18天前 120

目标50行代码之内完成3d编辑器功能。

 第一步,先来到thingjs平台的在线开发环境

三行代码加载了一个默认场景,就用这个默认场景作为底图基础,然后在上面加3d物体的编辑功能。

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


ThingJS平台因为封装了底层细节所以能做到快速开发的目的。


第二步,场景加载完成后进入编辑模式

app.on('load', function (ev) {
    state = app.stateManager.change('EditObject');
});


第三步,做一个编辑面板,简单一点四个元素, 两个模型,一个箭头线和一个管线,像下面这样


UI界面的代码如下:

// 创建工具条
var toolbar = new THING.widget.Panel({ width: '90px' });
// 绑定物体
var buttonObj = { '卡车': false, '房屋': false, '导线': false, '管线': false, };
var dataObj = {
    '卡车': {
        i: '#momoda_lc-icontubiao10',
        t: "Thing",
        u: "https://model.3dmomoda.com/models/262B016FBFC647968DC6F31E13437184/0/gltf/",
    },
    '房屋': {
        i: '#momoda_lc-icontubiao21',
        t: "Thing",
        u: "https://model.3dmomoda.com/models/378980A961674073BC8C4B935D890B33/0/gltf/",
    },
    '导线': {
        i: '#momoda_lc-icontubiao',
        t: "RouteLine",
        m: "https://www.thingjs.com/static/images/diffuse.jpg",
    },
    '管线': {
        i: '#momoda_lc-icontubiao10',
        t: "PolygonLine",
        m: "https://www.thingjs.com/static/images/poly_line_01.png"
    }
}
Loader.sync(['lib/iconfont.js'], function () {
    for (v in dataObj) {
        toolbar.addImageBoolean(buttonObj, v).url(dataObj[v].i);
    }
})


注释:因为面板库用到了图标 lib/iconfont.js 所以需要先用Loader.sync先加载图标。

toorlbar.addimage 为添加一个图标按键。发现实现面板的代码比功能逻辑还多~。

最后一步实现按键的创建模型回调

 toolbar.on('change', function (a) {
    var e = event || window.event;
    var object = state.createObject({ type:dataObj[a].t, url: dataObj[a].u, image: dataObj[a].m});
    state.startDrag(object, e.clientX, e.clientY, 0);
    return false;  // 不影响按键状态
});


完整代码如下:总共43行,真的不到50行(拷贝代码到在线开发环境可直接看效果):

var app = new THING.App({
    url: 'https://www.thingjs.com/static/models/storehouse'    // 场景地址
});
app.on('load', function (ev) {
    state = app.stateManager.change('EditObject');
});
// 创建工具条
var toolbar = new THING.widget.Panel({ width: '90px' });
// 绑定物体
var buttonObj = { '卡车': false, '房屋': false, '导线': false, '管线': false, }
var dataObj = {
    '卡车': {
        i: '#momoda_lc-icontubiao10',
        t: "Thing",
        u: "https://model.3dmomoda.com/models/262B016FBFC647968DC6F31E13437184/0/gltf/",
    },
    '房屋': {
        i: '#momoda_lc-icontubiao21',
        t: "Thing",
        u: "https://model.3dmomoda.com/models/378980A961674073BC8C4B935D890B33/0/gltf/",
    },
    '导线': {
        i: '#momoda_lc-icontubiao',
        t: "RouteLine",
        m: "https://www.thingjs.com/static/images/diffuse.jpg",
    },
    '管线': {
        i: '#momoda_lc-icontubiao10',
        t: "PolygonLine",
        m: "https://www.thingjs.com/static/images/poly_line_01.png"
    }
}
Loader.sync(['lib/iconfont.js'], function () {
    for (v in dataObj) {
        toolbar.addImageBoolean(buttonObj, v).url(dataObj[v].i)
    }
    toolbar.on('change', function (a) {
        var e = event || window.event;
        var object = state.createObject({ type:dataObj[a].t, url: dataObj[a].u, image: dataObj[a].m});
        state.startDrag(object, e.clientX, e.clientY, 0);
        return false;  // 不影响按键状态
    });
});

最终效果图如下:

最后于 18天前 被liuwei000000编辑 ,原因:
最新回复 (0)

你可以在 登录 or 注册 后,对此帖发表评论!

返回