threejs 模型添加文字的几种方式

news/2024/11/17 8:56:30/

在给几何体或者导入的模型表面添加文字时,可以用如下方式

1 将文字绘制到canvas中,并将其用作Texture

给正方体某个表面添加文字为例;如下创建一个正方体

// ---------------------------------------------------------------------
// 添加模型
// ---------------------------------------------------------------------
var geometry = new THREE.BoxGeometry( 30,30, 30 );
var materials = [ new THREE.MeshBasicMaterial( { color: 'blue' } ), // rightnew THREE.MeshBasicMaterial( { color: 'yellow' } ), // leftnew THREE.MeshBasicMaterial( { map: new THREE.CanvasTexture(getTextCanvas1()) } ), // topnew THREE.MeshBasicMaterial( { color: 'black' } ), // bottomnew THREE.MeshBasicMaterial( { color: 'green' } ), // backnew THREE.MeshBasicMaterial( { color: 'red' } ) // front ];
var cube = new THREE.Mesh( geometry, materials );
scene.add(cube);

其中正方体顶部表面,使用CanvasTexture作为材质,如下该材质可以用canvas或者img或者视频元素作为贴图,下面以canvas为例;

 在canvas中绘制文本,可以通过filltext绘制文本,遍历可以实现换行的效果

// 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;
}

效果:

优点是可以绘制任意样式文字,缺点是canvas一旦生成,因为分辨率不再改变,所以在threejs中放大时会模糊

2 用一个透明表面贴在几何体表面

        这种方式适合较规范的几何体模型;仍然以上面正方体为例,跟第一种方式原理差不多,将文字绘制在一个透明几何平面上,然后把平面的位置设置在刚好覆盖正方体前表面;

代码如下

function getTextCanvas2(){//用canvas生成图片let canvas = document.createElement("canvas");let ctx = canvas.getContext('2d')canvas.width = 300canvas.height = 300//制作矩形ctx.fillStyle = "gray"; ctx.fillRect(0, 0, 300, 300)//设置文字ctx.fillStyle = "white";ctx.font = 'normal 20px "楷体"'ctx.fillText('这个平面将被贴在正方体前表面', 0, 20)//生成图片let url = canvas.toDataURL('image/png');//将图片构建到纹理中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();

效果: 

可以看到没有贴到表面,需要调整z值为15.1, rect.position.set(0, 0, 15.1),看最后效果

 但是平面的颜色将原本正方体颜色覆盖

 将canvas矩形的颜色和材质颜色都设置为透明即可

  //制作矩形ctx.fillStyle = "transparent";  // 设为透明//将图片构建到纹理中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, // 设为透明})

 

3 使用threejs提供的文字几何体接口

通过THREE.TextGeometry生成文字几何体。在一个立方体表面遍历添加一排文字,效果如下:

 代码如下:

// ---------------------------------------------------------------------
// 添加文字模型
// ---------------------------------------------------------------------
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,  // 曲线控制点数bevelEnabled: true, // 斜角bevelThickness: 0.1,  // 斜角的深度bevelSize: 1,       // 斜角的大小bevelSegments: 1    // 斜角段数});var mat = new THREE.MeshPhongMaterial({color: "white",opacity: 0.8,shininess: 1,});var mesh = new THREE.Mesh(geometry, mat);mesh.rotation.y=-Math.PI/2mesh.position.set(-151,150-40*index, 15.1);scene.add(mesh);}); 
}

 其中chinese.json是字体文件,如下 three提供了几中默认的字体格式,但是都支持英文,如果要添加中文文字,需要借助转换工具,将ttf的文字格式转换为json文件

 转换很简单:

     首先下载字体文件宋体 字体库 免费下载 - 爱给网华文中宋,迷你简粗宋字体,迷你简粗宋体,汉仪超粗宋简字体,宋体粗体字体下载,经典繁超宋字体下载,锐字云字库大标宋体字体,文尔广告中宋字体,simsun字体,锐字小标宋体,长城特粗宋体字体下载,汉仪报宋简字体,长城大标宋体,流明体Heavy,苏新诗古印宋字体下载,长城小标宋体下载,锐字云字库小标宋体,锐字大标宋,华康雅宋体,锐字中长宋体字体,长城大标宋体字体下载,装甲明朝体,微软简标宋字体,长城小标https://www.aigei.com/font/class/song_style/

  然后使用在线转换工具Facetype.js,转换为json文件后下载即可。也可以将该工具下载到本地,直接运行;

如果在使用过程中,报错找不到stylename的情况,可能是因为下载的ttf某些属性缺失,那么可以适当调整main.js代码,如下

更多文章,小白gis http://xiaobaigis.comicon-default.png?t=M4ADhttp://xiaobaigis.com


http://www.ppmy.cn/news/733423.html

相关文章

vue3+ts 绘制流程图 vueflow 附代码及效果图

已完成渲染流程图,自定义模板内容(上下分级),自定义样式,新增节点addRandomNode,点击修改节点nodeClickHandler(从父组件传值) 官网:https://vueflow.dev/guide/node.html#node-template 文档比较复杂,很多想找的方法…

随手笔记——ROS下CMakeLists.txt中add_executable、target_link_libraries简单使用

随手笔记——ROS下CMakeLists.txt中add_executable、target_link_libraries简单使用说明 说明使用举例 说明 add_executable() 生成可执行文件 target_link_libraries() 为可执行文件或库添加链接库 使用举例 add_executable(iat_publish src/iat_publish.cppsrc/speech_rec…

液晶显示屏划痕修复方法

现在大家使用的电子设备都采用了液晶屏,而在日常使用中难免磕磕碰碰,这也使得液晶屏幕上经常会留下一些小划痕。天天看着这些碍眼的划痕,大家心里一定很不爽吧,实际上我们可以自己动手通过一些小技巧来将它们赶走。 工具/原料 铅笔…

光盘显示0字节可用_佳显LCD液晶专业生产液晶显示模块

GDRAM的读写:首先说明对GDRAM的操作基本单位是一个字,也就是2个字节,就是说读写时一次***少写2个字节,一次***少读2个字节。写数据:先开启扩展指令集(0x36),然后送地址,这里的地址与DDRAM中的略有不同&…

关于显示屏幕的一点点总结

关于显示屏幕的一点点总结 一、触摸屏类型: 1)电阻式触摸屏:四线电阻屏、五线电阻屏

LCD工控液晶触摸屏贴合如何进行贴合工程?

许多LCD液晶屏 s是没有触摸技术的简单显示屏。然而,随着社会应用的发展,许多工业设备和仅具有显示功能的显示设备已经不能满足市场的技术要求,人机交互越来越普遍。为了实现人机交互功能,触摸面板,如电阻式触摸屏、电容…

清洁机器人--屏幕显示LCD方案之MCU GD32F470及其液晶RGB接口的LCD驱动代码

1.MCU GD32F470及其液晶RGB接口 STM32F429 支持LCD RGB硬件接口,但是其存在供货 价格问题,暂时不选,选择国产替代方案。国产MCU中支持LCD RGB 硬件接口的有GD32F450 GD32F470.根据GD FAE最新消息450不在新推客户,推GD32F470. 2.不同的分辨率涉及不同RAM需求,如内置RAM不足…

使用Python控制1602液晶屏实时显示时间(附PyCharm远程调试)

前言 原创文章,转载引用务必注明链接。水平有限,如有疏漏,欢迎指正。 本文介绍一下UP板的GPIO资源使用,以及一个使用Python演示一个简单的demo。 本文使用Markdown写成,为获得更好的阅读体验和正常的图片、链接,请访问我的博客: http://www.cnblogs.com/sjqlwy/p/up_160…