在Three.js中支持波斯语/阿拉伯语文本

在Three.js中支持波斯语/阿拉伯语文本,three.js,arabic,persian,Three.js,Arabic,Persian,我需要用波斯语/阿拉伯语显示一些文本。我加载了包含字符的字体,并使用TextGeometry在场景中创建文本: var loader=new THREE.FontLoader(); loader.load('bzar_Regular.js',函数(字体){ var textGeo=新的3.TextGeometry('{ 字体:字体, 尺寸:1, 身高:0.05, 曲线段:12, }); var material=新的三个.MeshNormalMaterial(); var textMesh=ne

我需要用波斯语/阿拉伯语显示一些文本。我加载了包含字符的字体,并使用TextGeometry在场景中创建文本:

var loader=new THREE.FontLoader();
loader.load('bzar_Regular.js',函数(字体){
var textGeo=新的3.TextGeometry('{
字体:字体,
尺寸:1,
身高:0.05,
曲线段:12,
});
var material=新的三个.MeshNormalMaterial();
var textMesh=new THREE.Mesh(textGeo,material);
textMesh.position.x=15;
添加(textMesh);
});
我正期待着看《代码》但输出为:


字母被分开,字符的顺序被错误地颠倒。毕竟,threejs似乎不支持rtl语言。我是对的还是我错过了什么?有没有快速解决办法?谢谢。

这是一个复杂的问题。连字是连接字母的书法笔划,西方读者最熟悉的连字是草书英语的组成部分,在阿拉伯语中不是可选的。连字是语言固有的,它改变了文本的意义和形式。设计用于逐个提取每个字母(字形),并将其转换为形状路径。这在阿拉伯语中不起作用,因为这取决于特定的字母组合

我不相信在three.js中有一个可以修复的地方。虽然我很想知道O.P.提到的潜在解决方案是什么

可以将孤立的字母转换为最终的阿拉伯文连字形式或其他形式。然后,最终的表示形式可能会被发送到Three.js进行显示,这样就可以处理连字连接,Three.js接收最终的连字形式,而不是单独的图示符


使用a将文本转换为svg路径,然后使用three.js中的SVGLoader.js加载字母作为挤出路径,这可能是一个更简单的任务。但这必须经过测试,以确保将文本转换为可处理阿拉伯语的路径,如果这样,还需要检查连字连接的准确性。

首先,我发现Chris Loer的一篇非常有用的博客文章。他编写了一个插件()来解决这个问题

用法示例:

var rtlText=require('mapbox-gl-rtl-text');
var arabicString=“سلام”;
var shapedArabicText=rtlText.applyArabicShaping(arabicString);
var readyForDisplay=rtlText.processBidirectionalText(shapedArabicText,[]);

PS:当我将这个插件与常用的波斯语字体一起使用时,一些字母没有显示,所以我添加了一些来修复它

RtlTextHelper.farsify(“سلام”);
用法示例:

private createTextMesh(字体,文本){
var shapedText=RtlTextHelper.farsify(文本);
var fontSize=0.3;
var texthight=0.2;
var材料=新的三网格基本材料({
颜色:this.colors.label.normal,
侧面:三个。双面
});
var textGeo=新的三个.TextGeometry(shapedText{
字体:字体,
大小:fontSize,
身高:0.05,
曲线分段:12
});
var textMesh=new THREE.Mesh(textGeo,material);
textGeo.computeBoundingBox();
var-box=new THREE.Box3().setFromObject(textMesh);
var textLength=box.max.x;
返回{
网格:textMesh,
hight:texthight,
字体:{
大小:fontSize
},
长度:textLength
};
}

看起来您已经采取了适当的步骤将RTL添加到three.js()。作为一种解决方法,您可以编写一个脚本来反转字符串,然后再将其传递给
TextGeometry
@TheJim01反转字符串是解决方案的一部分,但不是全部。我读了一篇关于此主题的好文章,并找到了解决问题的步骤。我正在实施解决方案并对其进行测试。完成后我会写下答案。感谢您的评论。请参阅以了解为什么颠倒字符顺序不是解决方案,甚至不是解决方案的一部分。也很好。这对我不起作用,当我控制台结果时,它返回正确的结果,但three js无法将其显示为3d。好的,看起来有些阿拉伯字体无论如何都不起作用,我尝试了
Amiri
font,但不起作用,在我尝试了其他字体后,它可以与您的编辑一起工作。@shamaseen很高兴听到我的答案对您有所帮助。如果你觉得我的答案(和问题)有用,你可以投票表决。