Three.js 是一個強大的 JavaScript 庫,用于在網頁上創建和顯示 3D 圖形。在 Three.js 中,為模型添加文字是一個常見的需求,無論是為了標注、說明還是增強用戶體驗。本文將詳細介紹在 Three.js 中為模型添加文字的多種方式,包括使用 TextGeometry
、CSS2DRenderer
、CSS3DRenderer
、Sprite
以及自定義紋理等方法。
TextGeometry
創建 3D 文字TextGeometry
是 Three.js 提供的一個幾何體類,用于生成 3D 文字。它基于字體文件(通常是 .json
格式)來生成文字的幾何形狀,然后可以將其作為網格添加到場景中。
首先,你需要一個字體文件。Three.js 提供了一些默認的字體文件,可以在 examples/fonts
目錄下找到。你也可以使用在線工具(如 Facetype.js)將 .ttf
或 .otf
字體文件轉換為 .json
格式。
// 引入 Three.js
import * as THREE from 'three';
import { TextGeometry } from 'three/examples/jsm/geometries/TextGeometry.js';
import { FontLoader } from 'three/examples/jsm/loaders/FontLoader.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 fontLoader = new FontLoader();
fontLoader.load('fonts/helvetiker_regular.typeface.json', function (font) {
// 創建文字幾何體
const textGeometry = new TextGeometry('Hello Three.js', {
font: font,
size: 5,
height: 1,
curveSegments: 12,
bevelEnabled: true,
bevelThickness: 0.5,
bevelSize: 0.3,
bevelOffset: 0,
bevelSegments: 5
});
// 創建材質
const textMaterial = new THREE.MeshPhongMaterial({ color: 0x00ff00 });
// 創建網格
const textMesh = new THREE.Mesh(textGeometry, textMaterial);
// 設置文字位置
textMesh.position.set(-20, 0, -50);
// 添加到場景
scene.add(textMesh);
});
// 添加光源
const light = new THREE.DirectionalLight(0xffffff, 1);
light.position.set(0, 1, 1).normalize();
scene.add(light);
// 設置相機位置
camera.position.z = 50;
// 渲染循環
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();
CSS2DRenderer
添加 2D 文字CSS2DRenderer
是 Three.js 提供的一個渲染器,用于將 HTML 元素(如 div
)作為 2D 標簽添加到 3D 場景中。這種方式適合需要與 3D 模型交互的 2D 文字。
// 引入 Three.js
import * as THREE from 'three';
import { CSS2DRenderer, CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.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);
// 創建 CSS2DRenderer
const labelRenderer = new CSS2DRenderer();
labelRenderer.setSize(window.innerWidth, window.innerHeight);
labelRenderer.domElement.style.position = 'absolute';
labelRenderer.domElement.style.top = '0px';
document.body.appendChild(labelRenderer.domElement);
// 創建 3D 模型
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
// 創建 2D 文字標簽
const labelDiv = document.createElement('div');
labelDiv.className = 'label';
labelDiv.textContent = 'Cube';
labelDiv.style.color = 'white';
labelDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
labelDiv.style.padding = '5px';
labelDiv.style.borderRadius = '5px';
const label = new CSS2DObject(labelDiv);
label.position.set(0, 1.5, 0); // 設置標簽位置
cube.add(label);
// 設置相機位置
camera.position.z = 5;
// 渲染循環
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
labelRenderer.render(scene, camera);
}
animate();
CSS3DRenderer
添加 3D 文字CSS3DRenderer
是 Three.js 提供的另一個渲染器,用于將 HTML 元素作為 3D 對象添加到場景中。與 CSS2DRenderer
不同,CSS3DRenderer
可以將 HTML 元素放置在 3D 空間中,并應用 3D 變換。
// 引入 Three.js
import * as THREE from 'three';
import { CSS3DRenderer, CSS3DObject } from 'three/examples/jsm/renderers/CSS3DRenderer.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);
// 創建 CSS3DRenderer
const labelRenderer = new CSS3DRenderer();
labelRenderer.setSize(window.innerWidth, window.innerHeight);
labelRenderer.domElement.style.position = 'absolute';
labelRenderer.domElement.style.top = '0px';
document.body.appendChild(labelRenderer.domElement);
// 創建 3D 模型
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
// 創建 3D 文字標簽
const labelDiv = document.createElement('div');
labelDiv.className = 'label';
labelDiv.textContent = 'Cube';
labelDiv.style.color = 'white';
labelDiv.style.backgroundColor = 'rgba(0, 0, 0, 0.5)';
labelDiv.style.padding = '5px';
labelDiv.style.borderRadius = '5px';
const label = new CSS3DObject(labelDiv);
label.position.set(0, 1.5, 0); // 設置標簽位置
cube.add(label);
// 設置相機位置
camera.position.z = 5;
// 渲染循環
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
labelRenderer.render(scene, camera);
}
animate();
CSS2DRenderer
,且需要處理 HTML 元素的 3D 變換。Sprite
添加 2D 文字Sprite
是 Three.js 提供的一個 2D 對象,可以用于顯示圖片或文字。通過將文字渲染到 Canvas
上,然后將 Canvas
作為紋理應用到 Sprite
上,可以實現 2D 文字的顯示。
// 引入 Three.js
import * as THREE from 'three';
// 創建場景、相機和渲染器
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);
// 創建 Canvas 并繪制文字
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.width = 256;
canvas.height = 128;
context.fillStyle = 'rgba(0, 0, 0, 0.5)';
context.fillRect(0, 0, canvas.width, canvas.height);
context.font = '48px Arial';
context.fillStyle = 'white';
context.textAlign = 'center';
context.fillText('Hello Three.js', canvas.width / 2, canvas.height / 2);
// 創建紋理
const texture = new THREE.CanvasTexture(canvas);
// 創建 Sprite
const spriteMaterial = new THREE.SpriteMaterial({ map: texture });
const sprite = new THREE.Sprite(spriteMaterial);
sprite.scale.set(5, 2.5, 1); // 設置 Sprite 大小
scene.add(sprite);
// 設置相機位置
camera.position.z = 5;
// 渲染循環
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
animate();
除了使用 Sprite
,你還可以將文字渲染到紋理上,然后將紋理應用到 3D 模型的表面。這種方式適合需要在模型表面顯示文字的場景。
// 引入 Three.js
import * as THREE from 'three';
// 創建場景、相機和渲染器
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);
// 創建 Canvas 并繪制文字
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.width = 256;
canvas.height = 128;
context.fillStyle = 'rgba(0, 0, 0, 0.5)';
context.fillRect(0, 0, canvas.width, canvas.height);
context.font = '48px Arial';
context.fillStyle = 'white';
context.textAlign = 'center';
context.fillText('Hello Three.js', canvas.width / 2, canvas.height / 2);
// 創建紋理
const texture = new THREE.CanvasTexture(canvas);
// 創建 3D 模型
const geometry = new THREE.BoxGeometry();
const material = new THREE.MeshBasicMaterial({ map: texture });
const cube = new THREE.Mesh(geometry, material);
scene.add(cube);
// 設置相機位置
camera.position.z = 5;
// 渲染循環
function animate() {
requestAnimationFrame(animate);
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render(scene, camera);
}
animate();
在 Three.js 中,為模型添加文字有多種方式,每種方式都有其優缺點。選擇哪種方式取決于你的具體需求:
TextGeometry
。CSS2DRenderer
。CSS3DRenderer
。Sprite
或自定義紋理。希望本文能幫助你更好地理解在 Three.js 中為模型添加文字的各種方式,并為你的項目提供參考。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。