分享
查看: 3453|回复: 0

[发布] 50代码HTML5 Canvas 3D 编辑器优雅搞定

[复制链接]

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

发表于 2019-8-28 11:43:32 来自 发布 阅读模式 倒序浏览
zzv_icon3453 zzr_icon0 查看全部

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

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

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

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

  1. var app = new THING.App({
  2. url: 'https://www.thingjs.com/static/models/storehouse' // 场景地址
  3. });
复制代码


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


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

  1. app.on('load', function (ev) {
  2. state = app.stateManager.change('EditObject');
  3. });
复制代码


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

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

UI界面的代码如下:

  1. // 创建工具条
  2. var toolbar = new THING.widget.Panel({ width: '90px' });
  3. // 绑定物体
  4. var buttonObj = { '卡车': false, '房屋': false, '导线': false, '管线': false, };
  5. var dataObj = {
  6. '卡车': {
  7. i: '#momoda_lc-icontubiao10',
  8. t: "Thing",
  9. u: "https://model.3dmomoda.com/models/262B016FBFC647968DC6F31E13437184/0/gltf/",
  10. },
  11. '房屋': {
  12. i: '#momoda_lc-icontubiao21',
  13. t: "Thing",
  14. u: "https://model.3dmomoda.com/models/378980A961674073BC8C4B935D890B33/0/gltf/",
  15. },
  16. '导线': {
  17. i: '#momoda_lc-icontubiao',
  18. t: "RouteLine",
  19. m: "https://www.thingjs.com/static/images/diffuse.jpg",
  20. },
  21. '管线': {
  22. i: '#momoda_lc-icontubiao10',
  23. t: "PolygonLine",
  24. m: "https://www.thingjs.com/static/images/poly_line_01.png"
  25. }
  26. }
  27. Loader.sync(['lib/iconfont.js'], function () {
  28. for (v in dataObj) {
  29. toolbar.addImageBoolean(buttonObj, v).url(dataObj[v].i);
  30. }
  31. })
复制代码


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

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

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

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


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

  1. var app = new THING.App({
  2. url: 'https://www.thingjs.com/static/models/storehouse' // 场景地址
  3. });
  4. app.on('load', function (ev) {
  5. state = app.stateManager.change('EditObject');
  6. });
  7. // 创建工具条
  8. var toolbar = new THING.widget.Panel({ width: '90px' });
  9. // 绑定物体
  10. var buttonObj = { '卡车': false, '房屋': false, '导线': false, '管线': false, }
  11. var dataObj = {
  12. '卡车': {
  13. i: '#momoda_lc-icontubiao10',
  14. t: "Thing",
  15. u: "https://model.3dmomoda.com/models/262B016FBFC647968DC6F31E13437184/0/gltf/",
  16. },
  17. '房屋': {
  18. i: '#momoda_lc-icontubiao21',
  19. t: "Thing",
  20. u: "https://model.3dmomoda.com/models/378980A961674073BC8C4B935D890B33/0/gltf/",
  21. },
  22. '导线': {
  23. i: '#momoda_lc-icontubiao',
  24. t: "RouteLine",
  25. m: "https://www.thingjs.com/static/images/diffuse.jpg",
  26. },
  27. '管线': {
  28. i: '#momoda_lc-icontubiao10',
  29. t: "PolygonLine",
  30. m: "https://www.thingjs.com/static/images/poly_line_01.png"
  31. }
  32. }
  33. Loader.sync(['lib/iconfont.js'], function () {
  34. for (v in dataObj) {
  35. toolbar.addImageBoolean(buttonObj, v).url(dataObj[v].i)
  36. }
  37. toolbar.on('change', function (a) {
  38. var e = event || window.event;
  39. var object = state.createObject({ type:dataObj[a].t, url: dataObj[a].u, image: dataObj[a].m});
  40. state.startDrag(object, e.clientX, e.clientY, 0);
  41. return false; // 不影响按键状态
  42. });
  43. });
复制代码

最终效果图如下:

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

avatar
游客~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

130700ppkpl8x3t7tt1b1t