Как преобразовать загруженный шрифт Google из ttf в json для использования с ThreeJS FontLoader/TextGeometry?
import LatoFont from '../assets/fonts/lato-bold.json'
const loader = new FontLoader();
const font = loader.parse(LatoFont);
loader.load(font, font => {
const textGeo = new TextGeometry("Krypton", {
font: font,
size: 200,
height: 50,
curveSegments: 12,
bevelEnabled: false,
bevelThickness: 0.5,
bevelSize: 0.3,
bevelOffset: 0,
bevelSegments: 5,
})
const materials = [
new THREE.MeshPhongMaterial({ color: 0x00ff00, flatShading: true }), // front
new THREE.MeshPhongMaterial({ color: 0x00ff00 }) // side
]
const textMesh = new THREE.Mesh(textGeo, materials);
textGeo.computeBoundingBox();
const centerOffset = - 0.5 * (textGeo.boundingBox.max.x - textGeo.boundingBox.min.x);
textMesh.position.x = centerOffset;
textMesh.position.y = 100;
textMesh.position.z = 0;
textMesh.rotation.x = 0;
textMesh.rotation.y = Math.PI * 2;
group.add(textMesh);
})
Используя популярный онлайн-конвертер, я получаю:
Неперехваченный (в обещании) SyntaxError: JSON.parse: неожиданный символ в строке 1, столбце 1 данных JSON
ОБНОВЛЯТЬ:
Я обновил конфигурацию vite, чтобы иметь статический каталог. Но когда я собираю библиотеку и использую ее в другом проекте, у шрифта все еще возникают проблемы с загрузкой.
const path = require('path')
const { defineConfig } = require('vite')
module.exports = defineConfig({
build: {
lib: {
entry: path.resolve(__dirname, 'lib/main.ts'),
name: 'logo-threejs',
fileName: (format) => `logo-threejs.${format}.js`
}
},
publicDir: './static',
assetsInclude: ['**/*.typeface.json'],
});
Структура проекта:



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я предполагаю, что вы проверили все способы устранения неполадок, такие как путь, импорт, преобразование шрифта, структуру json…
Используя популярный онлайн-конвертер, я получаю:
Совершенно необычно, вы загружаете этот шрифт с помощью парсинга, я редко сталкиваюсь с таким способом, возможно там проблема, я не уверен.
В любом случае, попробуйте этот подход.
import { TextGeometry } from "https://esm.sh/three/addons/geometries/TextGeometry.js";
import { FontLoader } from "https://esm.sh/three/addons/loaders/FontLoader.js";
//…
const loader = new FontLoader();
loader.load(
'https://esm.sh/@compai/font-lato/data/typefaces/normal-900.json',
function (font) {
const textGeometry = new TextGeometry("Hiii", {
font: font,
size: 2,
height: 0.2,
});
const textMaterial = new THREE.MeshBasicMaterial({ color: 0xff0000 });
const textMesh = new THREE.Mesh(textGeometry, textMaterial);
textMesh.position.set(-2, 0, 0);
scene.add(textMesh);
}
);
https://codepen.io/Lucas_Mas/pen/xxMoPwq
Здесь у вас есть все шрифты:
https://github.com/comComponents-ai/typefaces/tree/main/packages
ОБНОВЛЕНИЕ 0
Если бы мне пришлось догадываться, то проблема кроется в расположении этого шрифта в вашем дереве... Потому что если бы вы сделали как в моем примере и скачали этот шрифт в готовый json или сконвертировали его здесь http://gero3 .github.io/facetype.js/ то, возможно, что-то не так с местоположением. Что касается бандлера, то я использую Vite.
threejs-vite-project/
├── node_modules/
├── src/
│ ├── index.html
│ ├── app.js
│ └── style.css
├── static/
│ └── font/
│ └── latoSans.json
├── package-lock.json
├── package.json
└── vite.config.js
Убедитесь, что ваш файл vite.config.js (если вы используете этот) правильно настроен для обслуживания статического каталога.
import { defineConfig } from 'vite';
export default defineConfig({
root: 'src',
build: {
outDir: '../dist'
},
publicDir: '../static'
});
И тогда путь должен выглядеть так:
const loader = new FontLoader();
loader.load(
'/static/font/latoSans.json',
function (font) {
const textGeometry = new TextGeometry("Hiii", {
font: font,
size: 2,
height: 0.2,
});
Тогда импорт должен выглядеть так
import { FontLoader } from 'three/addons/loaders/FontLoader.js';
import { TextGeometry } from 'three/addons/geometries/TextGeometry.js';
ОБНОВЛЕНИЕ 1
.typeface.json - вы написали, что скачали этот шрифт из пакетов по моей ссылке. По умолчанию шрифты оттуда не имеют этого расширения.assetsInclude: ['**/*.json']publicDir (особенно путь)ОБНОВЛЕНИЕ 2
Попробуйте этот подход
Проект А1
Дерево
project-Threejs-Vite
├── dist
│ ├── krypton-logo-threejs.es.js
│ ├── krypton-logo-threejs.umd.js
│ ├── lato-bold.json
├── lib
│ └── main.ts
├── node_modules
├── static
│ └── lato-bold.json
├── .gitignore
├── index.html
├── package-lock.json
├── package.json
├── README.md
├── style.css
└── tsconfig.json
Вите
const path = require('path');
const { defineConfig } = require('vite');
module.exports = defineConfig({
build: {
lib: {
entry: path.resolve(__dirname, 'lib/main.ts'),
name: 'logo-threejs',
fileName: (format) => `logo-threejs.${format}.js`
}
},
publicDir: './static',
assetsInclude: ['**/*.json'],
});
Проект А2
Дерево
project-B2
├── dist
├── lib
├── node_modules
├── public
│ └── lato-bold.json
├── src
│ └── main.js
├── .gitignore
├── index.html
├── package-lock.json
├── package.json
├── README.md
├── style.css
└── vite.config.js
Вите
import { defineConfig } from 'vite';
export default defineConfig({
publicDir: './public',
assetsInclude: ['**/*.json'],
});
Шрифт существует…
УБЕДИТЕСЬ, что папки содержат этот шрифт. Потому что это обычная проблема Vite: например, статические файлы (glb и т. д.) приходится перемещать вручную.
Путь проекта A2
const loader = new FontLoader();
loader.load('/public/lato-bold.json', …
Абсолютный путь
Если описанные выше действия не помогли, попробуйте установить абсолютный путь от public.
const aPath = '/lato-bold.json';
const loader = new FontLoader();
loader.load(aPath, …
ОБНОВЛЕНИЕ 3
Я так не думаю, что ts как-то связано не с загрузкой шрифтов, а скорее с расширениями и файлами в целом. Но мало ли…
Попробуйте установить "resolveJsonModule": true, потому что по умолчанию отключено.
И кстати, что говорит о сетевых запросах devtools или какой-нибудь подсказке в консоли?
Спасибо, это помогло загрузить шрифт в проект. Но теперь, когда я использую библиотеку в другом проекте, она все равно не загружается. Я обновил свою конфигурацию Vite, есть ли какие-либо изменения, которые вы видите?
Добавлена структура. Все остальное проверяется.
Все еще не работает, тьфу. Может ли быть что-то с tsconfig в проекте, который импортирует библиотеку?
@BAR Проверьте обновление, пожалуйста… еще раз…
Итак, проблема в том, что мне нужно скопировать шрифт в статический каталог импортирующего проекта. Если я не импортирую шрифт, он не будет связан с dist, а просто скопирован в dist.
@BAR Как я уже говорил в ОБНОВЛЕНИИ 2, это часто проблема с Vite (у меня такое было много раз с GLB). Я рад, что мы решаем вашу проблему. Приветствую тебя, приятель!
Допустим, я загружаю этот шрифт, как мне загрузить его из пакета моего сайта?