threejs?模型添加文字的多種方式匯總
在給幾何體或者導(dǎo)入的模型表面添加文字時(shí),可以用如下方式
1 將文字繪制到canvas中,并將其用作Texture
給正方體某個(gè)表面添加文字為例;如下創(chuàng)建一個(gè)正方體
// ---------------------------------------------------------------------
// 添加模型
// ---------------------------------------------------------------------
var geometry = new THREE.BoxGeometry( 30,30, 30 );
var materials = [
new THREE.MeshBasicMaterial( { color: 'blue' } ), // right
new THREE.MeshBasicMaterial( { color: 'yellow' } ), // left
new THREE.MeshBasicMaterial( { map: new THREE.CanvasTexture(getTextCanvas1()) } ), // top
new THREE.MeshBasicMaterial( { color: 'black' } ), // bottom
new THREE.MeshBasicMaterial( { color: 'green' } ), // back
new THREE.MeshBasicMaterial( { color: 'red' } ) // front
];
var cube = new THREE.Mesh( geometry, materials );
scene.add(cube);其中正方體頂部表面,使用CanvasTexture作為材質(zhì),如下該材質(zhì)可以用canvas或者img或者視頻元素作為貼圖,下面以canvas為例;

在canvas中繪制文本,可以通過filltext繪制文本,遍歷可以實(shí)現(xiàn)換行的效果
// CanvasTexture
function getTextCanvas1(){
let texts=[{
name:"北京",
value:323
},{
name:"杭州",
value:121
},{
name:"南京",
value:56
}]
var width=512, height=256;
var canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
var ctx = canvas.getContext('2d');
ctx.fillStyle = '#C3C3C3';
ctx.fillRect(0, 0, width, height);
ctx.font = 32+'px " bold';
ctx.fillStyle = '#2891FF';
texts.forEach((text,index)=>{
ctx.fillText(`${text.name}:${text.value}`, 10, 32 * index + 30);
})
return canvas;
}效果:

優(yōu)點(diǎn)是可以繪制任意樣式文字,缺點(diǎn)是canvas一旦生成,因?yàn)榉直媛什辉俑淖?,所以在threejs中放大時(shí)會(huì)模糊
2 用一個(gè)透明表面貼在幾何體表面
這種方式適合較規(guī)范的幾何體模型;仍然以上面正方體為例,跟第一種方式原理差不多,將文字繪制在一個(gè)透明幾何平面上,然后把平面的位置設(shè)置在剛好覆蓋正方體前表面;
代碼如下
function getTextCanvas2(){
//用canvas生成圖片
let canvas = document.createElement("canvas");
let ctx = canvas.getContext('2d')
canvas.width = 300
canvas.height = 300
//制作矩形
ctx.fillStyle = "gray";
ctx.fillRect(0, 0, 300, 300)
//設(shè)置文字
ctx.fillStyle = "white";
ctx.font = 'normal 20px "楷體"'
ctx.fillText('這個(gè)平面將被貼在正方體前表面', 0, 20)
//生成圖片
let url = canvas.toDataURL('image/png');
//將圖片構(gòu)建到紋理中
let geometry1 = new THREE.PlaneGeometry(30, 30)
let material1 = new THREE.MeshBasicMaterial({
map: new THREE.TextureLoader().load(url),
side: THREE.DoubleSide,
opacity: 1
})
let rect = new THREE.Mesh(geometry1, material1)
rect.position.set(0, 0, 25.1)
scene.add(rect)
}
getTextCanvas2();效果:

可以看到?jīng)]有貼到表面,需要調(diào)整z值為15.1, rect.position.set(0, 0, 15.1),看最后效果

但是平面的顏色將原本正方體顏色覆蓋
將canvas矩形的顏色和材質(zhì)顏色都設(shè)置為透明即可
//制作矩形
ctx.fillStyle = "transparent"; // 設(shè)為透明
//將圖片構(gòu)建到紋理中
let geometry1 = new THREE.PlaneGeometry(30, 30)
let material1 = new THREE.MeshBasicMaterial({
map: new THREE.TextureLoader().load(url),
side: THREE.DoubleSide,
opacity: 1,
transparent: true, // 設(shè)為透明
})
3 使用threejs提供的文字幾何體接口
通過THREE.TextGeometry生成文字幾何體。在一個(gè)立方體表面遍歷添加一排文字,效果如下:

代碼如下:
// ---------------------------------------------------------------------
// 添加文字模型
// ---------------------------------------------------------------------
let texts1=[
{
name:"北 京",
value:23
}
,{
name:"杭 州",
value:23
},
{
name:"南 京",
value:23
},
{
name:"南 京",
value:23
}
,{
name:"杭 州",
value:23
},
{
name:"南 京",
value:23
},
{
name:"南 京",
value:23
}
]
texts1.forEach((text,index)=>{
addTextGeometry(text,index);
})
// 添加文字geometry
function addTextGeometry(text,index){
var loader = new THREE.FontLoader();
loader.load("/statics/fonts/chinese.json", function (res) {
var geometry = new THREE.TextGeometry(`${text.name}: ${text.value}`, {
font: res, // 字體格式
size: 13, // 字體大小
height: 1, // 字體深度
curveSegments: 11, // 曲線控制點(diǎn)數(shù)
bevelEnabled: true, // 斜角
bevelThickness: 0.1, // 斜角的深度
bevelSize: 1, // 斜角的大小
bevelSegments: 1 // 斜角段數(shù)
});
var mat = new THREE.MeshPhongMaterial({
color: "white",
opacity: 0.8,
shininess: 1,
});
var mesh = new THREE.Mesh(geometry, mat);
mesh.rotation.y=-Math.PI/2
mesh.position.set(-151,150-40*index, 15.1);
scene.add(mesh);
});
}
其中chinese.json是字體文件,如下 three提供了幾中默認(rèn)的字體格式,但是都支持英文,如果要添加中文文字,需要借助轉(zhuǎn)換工具,將ttf的文字格式轉(zhuǎn)換為json文件

轉(zhuǎn)換很簡單:
首先下載字體,參考網(wǎng)站:http://www.dbjr.com.cn/fonts/
然后使用在線轉(zhuǎn)換工具Facetype.js,轉(zhuǎn)換為json文件后下載即可。也可以將該工具下載到本地,直接運(yùn)行;
如果在使用過程中,報(bào)錯(cuò)找不到stylename的情況,可能是因?yàn)橄螺d的ttf某些屬性缺失,那么可以適當(dāng)調(diào)整main.js代碼,如下

更多文章請(qǐng)參考文獻(xiàn)
到此這篇關(guān)于threejs 模型添加文字的幾種方式的文章就介紹到這了,更多相關(guān)threejs 模型添加文字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript正則函數(shù)中test和match的區(qū)別解析
在javascript中,用于檢測一個(gè)字符串是否匹配某個(gè)模式用的比較多的就是test和match方法。,這篇文章主要介紹了js正則函數(shù)中test和match的區(qū)別,需要的朋友可以參考下2022-11-11
基于JavaScript打造一款桌面級(jí)便簽系統(tǒng)
本文將用html,css和JavaScript實(shí)現(xiàn)一個(gè)簡單的便簽系統(tǒng)。除非手動(dòng)清空便簽,否則便簽會(huì)一直保留,非常方便。感興趣的小伙伴可以跟隨小編一起動(dòng)手試一試2022-02-02
javascript實(shí)現(xiàn)二分查找法實(shí)現(xiàn)代碼
javascript實(shí)現(xiàn)二分查找法實(shí)現(xiàn)代碼...2007-11-11
兩種方法實(shí)現(xiàn)文本框輸入內(nèi)容提示消失
第一種方法:基于HTML5 input標(biāo)簽的新特性 - placeholder 。另外,x-webkit-speech 屬性可以實(shí)現(xiàn)語音輸入功能;第二種方法: 用span模擬,定位span,借助JS鍵盤事件判斷輸入,確定span里的內(nèi)容顯示隱藏2013-03-03

