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中相同的方法下,重新刷新浏览器以便生效)