原创 文章, 转载请标明出处 https://blog.youkuaiyun.com/liuwei000000/article/details/83378837
1024程序员节刚过,手痒想实现一个html的3d编辑器,看了three.js 同时还看了网上流传已久的<<基于 HTML5 Canvas 的简易 2D 3D 编辑器>>,都觉得太复杂,一个3d编辑器貌似没有几百行代码搞不定。其实还真不是,那就用上次推荐的www.thingjs.com开发平台来试着做一下吧。
目标50行代码之内完成3d编辑器功能。
第一步,先来到thingjs平台的在线开发环境。

三行代码加载了一个默认场景,那就在这个基础上做吧。先把不需要的注释删了。
var app = new THING.App({
url: 'https://www.thingjs.com/static/models/storehouse' // 场景地址
});
thingjs平台因为封装了底层细节所以能做到快速开发的目的。
第二步,场景加载完成后进入编辑模式
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);
}
})
解释,因为面板库用到了图标 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; // 不影响按键状态
});
});
截屏效果。
后记:
为什么能短短50行就实现html canvas 3d编辑器的效果呢?
因为强大的封装。
做完了怎么给老板看呢?

点上面的演示按键,会出现三种演示方式 1. 电脑,2. 手机,3.iframe(嵌入到自己的页面)。还可以手机访问~,不知道手机访问好不好操作~。
那编辑完之后怎么退出编辑模式呢?
app.stateManager.leave('EditObject')
如果用three.js实现类似的功能需要多少行代码呢?
大概500行。
到底自己开发还是选择库开发?
研究底层技术当然是选自己做,如果是做项目,那还是用平台库来做吧。
本文介绍了如何使用thingjs平台,在50行代码内创建一个简单的3D编辑器。通过加载默认场景、设置编辑模式、构建编辑面板以及实现回调功能,实现了3D编辑功能。文章强调了thingjs平台的封装优势,使得快速开发成为可能,并提供了演示和退出编辑模式的方法。
915

被折叠的 条评论
为什么被折叠?



