2017-07-05 4 views
0

Ich muss etwas Text in persischer/arabischer Sprache zeigen. Ich lud eine Schriftart mit Zeichen und ich TextGeometry einen Text auf der Szene zu erstellen:Unterstützung für Farsi/arabische Texte in Three.js

var loader = new THREE.FontLoader(); 
loader.load('B Zar_Regular.js', function (font) { 
    var textGeo = new THREE.TextGeometry('سلام!', { 
     font: font, 
     size: 1, 
     height: 0.05, 
     curveSegments: 12, 
    }); 
    var material = new THREE.MeshNormalMaterial(); 
    var textMesh = new THREE.Mesh(textGeo, material); 
    textMesh.position.x = 15; 
    scene.add(textMesh); 
}); 

Ich erwartete سلام! zu sehen, aber der Ausgang war:

three.js arabic text problem

Buchstaben werden getrennt und bestellen von Zeichen wird fälschlicherweise umgekehrt. Immerhin scheinen Threejs keine RTL-Sprachen zu unterstützen. Habe ich Recht oder habe ich etwas verpasst? Gibt es eine Problemumgehung als schnelle Lösung? Vielen Dank.

+0

Es sieht so aus, als hätten Sie bereits den geeigneten Schritt unternommen, um RTL zu three.js hinzuzufügen (https://github.com/mrdoob/three.js/issues/11680). Um dieses Problem zu umgehen, könnten Sie ein Skript schreiben, um die Zeichenfolge umzukehren, bevor Sie sie an 'TextGeometry' übergeben. – TheJim01

+0

@ TheJim01 Umkehrung der Zeichenfolge ist Teil der Lösung, aber nicht alle, ich habe einen guten Artikel über das Thema gelesen und ich fand die Schritte, um das Problem zu lösen. Ich implementiere die Lösung und teste sie. Ich werde eine Antwort aufschreiben, wenn es fertig ist. Danke für den Kommentar. –

+0

Siehe [diese Regeln] (https://w3c.github.io/alreq/), um zu verstehen, warum das Umkehren der Zeichenreihenfolge keine Lösung oder sogar ein Teil der Lösung ist. – Radio

Antwort

0

Dies ist ein komplexes Problem. Ligaturen, die kalligraphischen Striche, die Buchstaben miteinander verbinden, die den westlichen Lesern als Bestandteil des kursiven Englisch am vertrautesten sind, sind im Arabischen nicht optional. Ligaturen sind der Sprache eigen und verändern die Bedeutung und Formalität des Textes. Die font.js class ist entworfen, um jeden Buchstaben (Glyphe) eins nach dem anderen zu nehmen und es in einen Formpfad umzuwandeln. Dies funktioniert nicht auf Arabisch, da joining rules are complex abhängig von bestimmten Buchstabenkombinationen.

Ich glaube nicht, dass es eine Lösung gibt, die in three.js implementiert werden kann. Obwohl ich gerne wissen würde, was die mögliche Lösung ist, wie in O.P.

erwähnt, kann es möglich sein, isolierte Buchstaben in die endgültigen arabischen Ligaturformen via this script oder maybe this one zu konvertieren. Die endgültigen Präsentationsformulare können dann zur Anzeige an Three.js gesendet werden, so dass die Ligaturverbindungen bereits behandelt werden und three.js die endgültigen ligierten Formen anstelle der isolierten Glyphen empfängt.

Es kann eine einfachere Aufgabe sein, Text in Svg-Pfade zu konvertieren, indem Sie text to path converter verwenden und dann die SVGLoader.js in threw.js verwenden, um die Buchstaben als Pfade für die Extrusion zu laden. Aber dies müsste getestet werden, um sicherzustellen, dass die Umwandlung von Text in einen Pfad überhaupt Arabisch beherrscht, und wenn dies der Fall ist, müssen die Ligaturverbindungen ebenfalls auf Genauigkeit überprüft werden.