import * as THREE from 'three';
|
import { useEffect, useState } from 'react';
|
|
function generateSprite(text, color, fontSize = 50) {
|
const canvas = document.createElement('canvas');
|
canvas.width = 300;
|
canvas.height = 300;
|
const context = canvas.getContext('2d');
|
context.beginPath();
|
context.font = `${fontSize}px Microsoft YaHei`;
|
context.fillStyle = color;
|
context.textAlign = 'center';
|
context.textBaseline = 'middle';
|
context.fillText(text, canvas.width / 2, canvas.height / 2);
|
context.fill();
|
context.stroke();
|
return canvas;
|
}
|
|
const Text = (props) => {
|
const { text, position, color = '#00D1D1', fontSize = 100 } = props;
|
|
const [material, setMaterial] = useState(undefined);
|
const [scale, setScale] = useState(new THREE.Vector3(100, 100, 100));
|
|
useEffect(() => {
|
const canvas = generateSprite(text, color, fontSize);
|
const texture = new THREE.CanvasTexture(canvas);
|
setScale(new THREE.Vector3(texture.image.width / 4, texture.image.height / 4, 1));
|
const material = new THREE.SpriteMaterial({
|
map: texture,
|
blending: THREE.AdditiveBlending,
|
});
|
setMaterial(material);
|
}, [text, color, fontSize]);
|
|
return <sprite material={material} position={position} scale={scale} />;
|
}
|
|
export default Text;
|