1. 介绍

这里以3D文本为例,这个算是3D对象中比较复杂的了

2. 操作步骤

2.1. 事先加载3D文本中可能用到的所有字体文件

  • 因为在从文件加载3D文本对象时,需要直接返回geometry对象,而不能在回调函数中返回geometry对象。而3D文本所需要的字体只能通过FontLoader对象异步加载,因此需要在3D场景生成后、文件加载前就加载字体,并保存到editor.fonts中,以便后续使用
  • 在pk3dscene.js文件中,pk3d._onInit3DOK方法最后调用:pk3d._loadTextFonts(); // 加载字体,并保存到editor.fonts中
  • pk3d._onInit3DOK是在生成3D对象成功后,但没有从配置文件加载场景时执行的
  • 同时实现下面两个方法
    _loadTextFont:function(fontNames){
    if(fontNames.length<=0)
    return;
    var fontName=fontName[0];
    fontNames.splice(0,1);
    var textLoad = new THREE.FontLoader().load('../../dist/3d/fonts/'+fontName,function(font) {
    editor.fonts[fontName] = font;
    if(fontNames.length>1){
    pk3d._loadTextFont(fontNames);
    }
    });
    },
    _loadTextFonts:function(){ // 异步调用加载所有的字体函数以便生成3D文本,或从文件加载包含3D文本的时候可以直接使用
    var fontNames=['helvetiker_regular.typeface.json','droid_sans_bold.typeface.json','droid_sans_mono_regular.typeface.json','droid_sans_regular.typeface.json','droid_serif_bold.typeface.json',
    'droid_serif_regular.typeface.json','gentilis_bold.typeface.json','gentilis_regular.typeface.json',
    'helvetiker_bold.typeface.json','kenpixel.ttf',
    'optimer_bold.typeface.json','optimer_regular.typeface.json'];
    pk3d._loadTextFont(fontNames);
    },

2.2. 增加菜单

2.2.1. 增加菜单字符串定义

在Strings.js文件中,为每个语言增加字符串ID定义:

Strings.values.en中增加:

'menubar/add/text3D': '3DText',

Strings.values.zh中增加:
'menubar/add/text3D': '3D文本'

2.2.2. 增加菜单入口定义

在Menubar.Add.js中,增加菜单入口和实现(var MenubarAdd = function ( editor )构造函数中):

2.3. 增加保存到文件的代码

还需要将代码增加到保存对象之中

Editor.js的geometriesToBin方法中:


2.4. 增加从文件读取的代码

Editor.js的geometriesFromBin方法中

2.5. 增加从文件读取后重新生成3D文本对象的代码

ObjectLoader.js的parseGeometries方法中增加:

(注意:该代码在idea调试模式下需要执行build-three.bat才能生效。也可以将下面代码直接复制到three.module.js中相同的方法下,重新刷新浏览器以便生效)


  • 无标签