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

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.comhttp://xiaobaigis.com

threejs 模型添加文字的几种方式相关推荐

  1. python文字教程-Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...

  2. java jframe添加面板_JFrame添加组件的两种方式

    对JFrame添加组件有两种方式:1) 用getContentPane()方法获得JFrame的内容面板,再对其加入组件:frame.getContentPane().add(childCompont ...

  3. python怎么在图片上写字_Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...

  4. python如何在图片上添加文字_Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...

  5. 怎样在python的turtle中输入文字_Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...

  6. 怎么在python中添加文字_Python在图片中添加文字的两种方法

    本文主要介绍的是利用Python在图片中添加文字的两种方法,下面分享处理供大家参考学习,下来要看看吧 一.使用OpenCV 在图片中添加文字看上去很简单,但是如果是利用OpenCV来做却很麻烦.Ope ...

  7. cocos2d-x 中添加显示文字的三种方式 LabelTTF 、LabelBMFont 和 LabelAtlas

    在 cocos2d-x 中有三个类可以在层或精灵中添加文字: LabelTTF LabelBMFont LabelAtlas LabelTTF 直接支持使用 TTF 字库,可以支持全部的中文,但是效率 ...

  8. 总结一下模型工程化部署的几种方式

    今天我就来聊聊的对于模型的线上部署和工程化的问题的认识和工程实践. 在企业中,我们做模型的目的就是为了能够让它来更好的解决产品在实际生产过程中所遇到的具体的问题,而模型训练好之后,下一步要做的就是将其 ...

  9. android动态居中布局,Android动态添加布局的两种方式

    释放双眼,带上耳机,听听看~! 前言 大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致. 所以今天我们就来学习一些动态加添布局的 ...

  10. android动态改变布局,Android 动态添加布局的两种方式

    前言 大多数时候我们布局都是用xml来布局的,但有些时候也是会用到动态布局的,尤其是在一些大项目中,动态布局更是体现的淋漓尽致. 所以今天我们就来学习一些动态加添布局的两种方式,分别是 动态添加xml ...

最新文章

  1. 主动做了业务监控,产品经理对我竖起大拇指
  2. python timestamp和datetime之间的转换_python – 在datetime,Timestamp和datetime64之间转换
  3. iOS-多线程 ,整理集锦,多种线程的创建
  4. echarts x轴像直尺一样设置刻度_MATLAB作图实例:6:指定轴刻度值和标签
  5. python分解word文档为多个_用python批量处理word文档
  6. 当内存512遇上Access数据库600M,IO磁盘受伤了
  7. 敏捷开发中XP与SCRUM的区别
  8. 批量裁剪或延伸的lisp程序_10 行 Python 代码,批量压缩图片 500 张,简直太强大了...
  9. php 中echo用法,php中echo()函数的用法(附代码)
  10. SpringBoot整合Mail之设置发件人昵称
  11. 手机浏览器和pc浏览器下载文件方法
  12. 打印机 计算机 usb,来古计算机-打印机端口自动识别成 USB大容量存储设备(USB mass storage device)...
  13. 企业信息系统集成发展阶段及ESB对企业的价值体现
  14. 35岁之前不应该错过的30本书
  15. Qt for IOS 制作APP启动页面
  16. SolidWorks的通过函数驱动绘制曲线
  17. 我的世界虚拟人生可以在服务器玩吗,我的世界虚拟人生全方位攻略 虚拟人生玩法介绍...
  18. 2023云南师范大学计算机考研信息汇总
  19. 尘缘如梦_转载网友_天还是那么蓝
  20. Qt文档阅读笔记-DTLS client解析

热门文章

  1. px和毫米的换算_iOS尺寸单位pt、ppi与px之间换算关系
  2. 利用PS和抠图软件轻松换证件照背景
  3. 微信聊天记录做成词云~
  4. 格志AK890打印驱动安装
  5. 海康威视+虹软人脸识别
  6. dw如何制作图片自动切换效果_DW制作自动切换图js代码
  7. libtorrent编译
  8. 无法访问计算机0x80070035,在win7中访问本地网络上的共享文件时错误0x80070035的解决方案...
  9. 巴斯勒相机的相机控制类析构函数多次调用的问题
  10. C# libUSBDotNet 操作USB