Three.js实现绘制字体模型示例代码


Posted in Javascript onSeptember 26, 2017

前言

本文主要给大家介绍了关于利用Three.js绘制字体模型的相关内容,使用three.js绘制字体模型,没有想象当中那么难。下面话不多说了,来一起看看详细的介绍:

  • 首先你需要实例化 THREE.FontLoader() 来进行json格式的文字格式加载,在加载成功的回调函数里面进行创建网格。
  • 然后通过THREE.TextBufferGeometry或者THREE.TextGeometry方法进行网格创建,并将需要设置的问题传入。
  • 再设置一个纹理,通过THREE.Mesh()函数创建成图形添加到场景当中即可。

示例代码:

var fontModel; 
 function initModel() { 
 var font; 
 var loader = new THREE.FontLoader(); 
 loader.load("examples/fonts/gentilis_regular.typeface.json", function (res) { 
  font = new THREE.TextBufferGeometry("fdsfasd", { 
  font: res, 
  size: 100, 
  height: 60 
  }); 
 
  font.computeBoundingBox(); // 运行以后设置font的boundingBox属性对象,如果不运行无法获得。 
  //font.computeVertexNormals(); 
 
  var map = new THREE.TextureLoader().load("examples/textures/UV_Grid_Sm.jpg"); 
  var material = new THREE.MeshLambertMaterial({map:map,side:THREE.DoubleSide}); 
 
  fontModel = new THREE.Mesh(font,material); 
 
  //设置位置 
  fontModel.position.x = - (font.boundingBox.max.x - font.boundingBox.min.x)/2; //计算出整个模型的宽度的一半 
  fontModel.position.y = - 50; 
  fontModel.position.z = - 30; 
 
  scene.add(fontModel); 
 }); 
 }

最后又调节了一下位置,就成了现在这个样子的代码。

最后放上所有的代码:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
 <meta charset="UTF-8"> 
 <title>Title</title> 
 <style type="text/css"> 
 html, body { 
  margin: 0; 
  height: 100%; 
 } 
 
 canvas { 
  display: block; 
 } 
 
 </style> 
</head> 
<body onload="draw();"> 
 
</body> 
<script src="build/three.js"></script> 
<script src="examples/js/controls/OrbitControls.js"></script> 
<script src="examples/js/libs/stats.min.js"></script> 
<script> 
 var renderer; 
 function initRender() { 
 renderer = new THREE.WebGLRenderer({antialias: true}); 
 renderer.setSize(window.innerWidth, window.innerHeight); 
 document.body.appendChild(renderer.domElement); 
 } 
 
 var camera; 
 function initCamera() { 
 camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000); 
 camera.position.set(0, 0, 400); 
 } 
 
 var scene; 
 function initScene() { 
 scene = new THREE.Scene(); 
 } 
 
 var light; 
 function initLight() { 
 scene.add(new THREE.AmbientLight(0x404040)); 
 
 light = new THREE.DirectionalLight(0xffffff); 
 light.position.set(1, 1, 1); 
 scene.add(light); 
 } 
 
 var fontModel; 
 function initModel() { 
 var font; 
 var loader = new THREE.FontLoader(); 
 loader.load("examples/fonts/gentilis_regular.typeface.json", function (res) { 
  font = new THREE.TextBufferGeometry("fdsfasd", { 
  font: res, 
  size: 100, 
  height: 60 
  }); 
 
  font.computeBoundingBox(); // 运行以后设置font的boundingBox属性对象,如果不运行无法获得。 
  //font.computeVertexNormals(); 
 
  var map = new THREE.TextureLoader().load("examples/textures/UV_Grid_Sm.jpg"); 
  var material = new THREE.MeshLambertMaterial({map:map,side:THREE.DoubleSide}); 
 
  fontModel = new THREE.Mesh(font,material); 
 
  //设置位置 
  fontModel.position.x = - (font.boundingBox.max.x - font.boundingBox.min.x)/2; //计算出整个模型的宽度的一半 
  fontModel.position.y = - 50; 
  fontModel.position.z = - 30; 
 
  scene.add(fontModel); 
 }); 
 } 
 
 //初始化性能插件 
 var stats; 
 function initStats() { 
 stats = new Stats(); 
 document.body.appendChild(stats.dom); 
 } 
 
 //用户交互插件 鼠标左键按住旋转,右键按住平移,滚轮缩放 
 var controls; 
 function initControls() { 
 
 controls = new THREE.OrbitControls(camera, renderer.domElement); 
 
 // 如果使用animate方法时,将此函数删除 
 //controls.addEventListener( 'change', render ); 
 // 使动画循环使用时阻尼或自转 意思是否有惯性 
 controls.enableDamping = true; 
 //动态阻尼系数 就是鼠标拖拽旋转灵敏度 
 //controls.dampingFactor = 0.25; 
 //是否可以缩放 
 controls.enableZoom = true; 
 //是否自动旋转 
 controls.autoRotate = false; 
 //设置相机距离原点的最远距离 
 controls.minDistance = 200; 
 //设置相机距离原点的最远距离 
 controls.maxDistance = 600; 
 //是否开启右键拖拽 
 controls.enablePan = true; 
 } 
 
 function render() { 
 renderer.render(scene, camera); 
 } 
 
 //窗口变动触发的函数 
 function onWindowResize() { 
 camera.aspect = window.innerWidth / window.innerHeight; 
 camera.updateProjectionMatrix(); 
 render(); 
 renderer.setSize(window.innerWidth, window.innerHeight); 
 
 } 
 
 function animate() { 
 //更新控制器 
 controls.update(); 
 render(); 
 
 //更新性能插件 
 stats.update(); 
 requestAnimationFrame(animate); 
 } 
 
 function draw() { 
 initRender(); 
 initScene(); 
 initCamera(); 
 initLight(); 
 initModel(); 
 initControls(); 
 initStats(); 
 
 animate(); 
 window.onresize = onWindowResize; 
 } 
</script> 
</html>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JS应用之禁止抓屏、复制、打印
Feb 21 Javascript
Eval and new funciton not the same thing
Dec 27 Javascript
js兼容的placeholder属性详解
Aug 18 Javascript
js实现匹配时换色的输入提示特效代码
Aug 17 Javascript
原生javascript实现匀速运动动画效果
Feb 26 Javascript
BootStrap下的弹出框加载select2框架失败的解决方法
Aug 31 Javascript
解决vue2.0动态绑定图片src属性值初始化时报错的问题
Mar 14 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
May 31 jQuery
ES6 Promise对象概念及用法实例详解
Oct 15 Javascript
jQuery轮播图功能制作方法详解
Dec 03 jQuery
vue 内联样式style中的background用法说明
Aug 05 Javascript
使用AutoJs实现微信抢红包的代码
Dec 31 Javascript
Three.js利用Detector.js插件如何实现兼容性检测详解
Sep 26 #Javascript
JS+jQuery实现注册信息的验证功能
Sep 26 #jQuery
详解vue-cli中的ESlint配置文件eslintrc.js
Sep 25 #Javascript
JavaScript 自定义事件之我见
Sep 25 #Javascript
详解在vue-cli中使用路由
Sep 25 #Javascript
Bootstrap一款超好用的前端框架
Sep 25 #Javascript
vue封装第三方插件并发布到npm的方法
Sep 25 #Javascript
You might like
浅析php学习的路线图
2013/07/10 PHP
PHP使用PDO连接ACCESS数据库
2015/03/05 PHP
PHP文件上传类实例详解
2016/04/08 PHP
python进程与线程小结实例分析
2018/11/11 PHP
PHP 对象接口简单实现方法示例
2020/04/13 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
jQuery+PHP实现微信转盘抽奖功能的方法
2016/05/25 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
BootStrap3使用错误记录及解决办法
2016/12/22 Javascript
详解vuex 中的 state 在组件中如何监听
2017/05/23 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
浅谈发布订阅模式与观察者模式
2019/04/09 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
[01:13]2015国际邀请赛线下观战现场
2015/08/08 DOTA
Python中的lstrip()方法使用简介
2015/05/19 Python
Python的Django框架中从url中捕捉文本的方法
2015/07/20 Python
Python语言描述最大连续子序列和
2017/12/05 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
python生成密码字典的方法
2018/07/06 Python
在python里从协程返回一个值的示例
2019/02/19 Python
用pycharm开发django项目示例代码
2019/06/13 Python
python爬取盘搜的有效链接实现代码
2019/07/20 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
Python3连接Mysql8.0遇到的问题及处理步骤
2020/02/17 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
介绍一下Cookie和Session及他们之间的区别
2012/11/20 面试题
说出数据连接池的工作机制是什么?
2013/04/19 面试题
酒店员工培训方案
2014/06/02 职场文书
音乐教师求职信
2014/06/28 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang