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 = ({
|
text,
|
position,
|
scale = new THREE.Vector3(100, 100, 100),
|
color = '#00D1D1',
|
fontSize = 50,
|
}) => {
|
const [material, setMaterial] = useState(undefined);
|
useEffect(() => {
|
const material = new THREE.SpriteMaterial({
|
map: new THREE.CanvasTexture(generateSprite(text, color, fontSize)),
|
blending: THREE.AdditiveBlending,
|
});
|
setMaterial(material);
|
}, [text, color, fontSize]);
|
|
return <sprite material={material} position={position} scale={scale} />;
|
}
|
|
export default Text;
|