Как конвертировать шрифт Google для использования с ThreeJS

Как преобразовать загруженный шрифт 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'],
});

Структура проекта:

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
140
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я предполагаю, что вы проверили все способы устранения неполадок, такие как путь, импорт, преобразование шрифта, структуру 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

  1. Я не знаю, как называется шрифт, но убедитесь, что у вас есть соответствующее расширение .typeface.json - вы написали, что скачали этот шрифт из пакетов по моей ссылке. По умолчанию шрифты оттуда не имеют этого расширения.
  2. Если вы оставите имя шрифта по умолчанию, попробуйте изменить его assetsInclude: ['**/*.json']
  3. Дважды проверьте путь publicDir (особенно путь)
  4. Дважды проверьте импорт, особенно экспорт, потому что вы уже успешно импортировали этот шрифт раньше.

ОБНОВЛЕНИЕ 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 или какой-нибудь подсказке в консоли?

Допустим, я загружаю этот шрифт, как мне загрузить его из пакета моего сайта?

BAR 05.06.2024 04:42

Спасибо, это помогло загрузить шрифт в проект. Но теперь, когда я использую библиотеку в другом проекте, она все равно не загружается. Я обновил свою конфигурацию Vite, есть ли какие-либо изменения, которые вы видите?

BAR 06.06.2024 16:13

Добавлена ​​структура. Все остальное проверяется.

BAR 07.06.2024 06:01

Все еще не работает, тьфу. Может ли быть что-то с tsconfig в проекте, который импортирует библиотеку?

BAR 07.06.2024 21:03

@BAR Проверьте обновление, пожалуйста… еще раз…

Łukasz D. Mastalerz 07.06.2024 22:16

Итак, проблема в том, что мне нужно скопировать шрифт в статический каталог импортирующего проекта. Если я не импортирую шрифт, он не будет связан с dist, а просто скопирован в dist.

BAR 08.06.2024 16:56

@BAR Как я уже говорил в ОБНОВЛЕНИИ 2, это часто проблема с Vite (у меня такое было много раз с GLB). Я рад, что мы решаем вашу проблему. Приветствую тебя, приятель!

Łukasz D. Mastalerz 08.06.2024 17:22

Другие вопросы по теме