在Three.js中,可以通过不同的方式向模型添加标签。这里提供了三种方式:使用矩形平面作为背景,使用精灵图(Sprite),以及使用CSS2DObject。
- 矩形平面(使用
Mesh
和PlaneGeometry
):
var geometry = new THREE.PlaneGeometry(100, 50);
var material = new THREE.MeshBasicMaterial({ map: new THREE.CanvasTexture(generateLabelCanvas()), transparent: true });
var labelPlane = new THREE.Mesh(geometry, material);
labelPlane.position.set(0, 10, 0);
scene.add(labelPlane);
function generateLabelCanvas() {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
ctx.fillStyle = "rgba(255,255,255,1)";
ctx.fillRect(0, 0, 100, 50);
ctx.font = '20px Arial';
ctx.fillStyle = 'black';
ctx.fillText('标签文字', 10, 30);
return canvas;
}
- 精灵图(使用
Sprite
):
var sprite = new THREE.Sprite(new THREE.SpriteMaterial({ map: new THREE.CanvasTexture(generateLabelCanvas()) }));
sprite.scale.set(10, 5, 1); // 根据需要调整大小
sprite.position.set(0, 10, 0);
scene.add(sprite);
- CSS2DObject(将2D CSS元素与3D场景整合):
var labelDiv = document.createElement('div');
labelDiv.style.color = 'white';
labelDiv.innerHTML = '标签文字';
var labelObject = new THREE.CSS2DObject(labelDiv);
labelObject.position.set(0, 10, 0);
scene.add(labelObject);
以上代码中generateLabelCanvas
函数用于生成包含文本的Canvas,这个Canvas将作为材质的纹理应用到模型上。
在实际使用时,你需要根据模型的位置和大小调整矩形平面或精灵图的尺寸和位置。CSS2DObject可以与Three.js的其他对象无缝整合,但它需要WebGLRenderer的domElement
被整合到DOM中去,并且要处理CSS与WebGL渲染结果的叠加问题。