Three.jsでテキストを配置する方法をメモ。
今回はViteを使った開発環境での使用例になります。
設定方法
まずは使用するフォントを用意します。
今回はGoogle FontsのKanitをダウンロードしました。
ダウンロードしたフォントの拡張子はttfですが、Three.jsでロードする際はjson形式である必要があるようです。
公式のドキュメント内で紹介されているfacetype.jsで変換を行います。
publicディレクトリ内にfontフォルダを作成して、上記で変換を行ったファイルを格納します。
これでテキストを配置する準備ができたので、実際に試してみます。
import * as THREE from 'three'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { FontLoader } from 'three/addons/loaders/FontLoader.js'; import { TextGeometry } from 'three/addons/geometries/TextGeometry.js'; // シーンの作成 const scene = new THREE.Scene(); // カメラの作成 const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); // レンダラーの作成 const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // カメラ操作の設定 const controls = new OrbitControls(camera, renderer.domElement); // カメラの位置変更と更新 camera.position.set(0, 0, 100); controls.update(); // フォントの読み込み const loader = new FontLoader(); loader.load("font/Kanit_Regular.json", (font) => { console.log(font); // オブジェクトの作成 const geometry = new TextGeometry("Sample Text", { font: font, size: 10, depth: 5 }); const material = new THREE.MeshBasicMaterial({ color: "orange" }) const object = new THREE.Mesh(geometry, material); scene.add(object); }); function animate() { renderer.render(scene, camera); } renderer.setAnimationLoop(animate);
TextGeometryとFontLoaderはアドオンのため、別途インポートが必要になります。
これでThree.jsでテキストを配置することができました。
テキストを配置するデモページ
最後にテキストをセンタリングに調整します。
import * as THREE from 'three'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { FontLoader } from 'three/addons/loaders/FontLoader.js'; import { TextGeometry } from 'three/addons/geometries/TextGeometry.js'; // シーンの作成 const scene = new THREE.Scene(); // カメラの作成 const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); // レンダラーの作成 const renderer = new THREE.WebGLRenderer(); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); // カメラ操作の設定 const controls = new OrbitControls(camera, renderer.domElement); // カメラの位置変更と更新 camera.position.set(0, 0, 100); controls.update(); // フォントの読み込み const loader = new FontLoader(); loader.load("font/Kanit_Regular.json", (font) => { console.log(font); // オブジェクトの作成 const geometry = new TextGeometry("Sample Text", { font: font, size: 10, depth: 5 }); geometry.center(); const material = new THREE.MeshBasicMaterial({ color: "orange" }) const object = new THREE.Mesh(geometry, material); scene.add(object); }); function animate() { renderer.render(scene, camera); } renderer.setAnimationLoop(animate);
コメントが承認されるまで時間がかかります。