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 相关文章推荐
jquery ajax对特殊字符进行转义防止js注入使用示例
Nov 21 Javascript
jquery获取及设置outerhtml的方法
Mar 09 Javascript
javascript实现简单的省市区三级联动
May 14 Javascript
jQuery EasyUI Draggable拖动组件
Mar 01 Javascript
angular学习之ngRoute路由机制
Apr 12 Javascript
详解利用 Express 托管静态文件的方法
Sep 18 Javascript
剖析Angular Component的源码示例
Mar 23 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
Jan 09 Javascript
node.js中express模块创建服务器和http模块客户端发请求
Mar 06 Javascript
React中阻止事件冒泡的问题详析
Apr 12 Javascript
JavaScript位置参数实现原理及过程解析
Sep 14 Javascript
vue二选一tab栏切换新做法实现
Jan 19 Vue.js
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-MySQL教程归纳总结
2008/06/07 PHP
从零开始学YII2框架(六)高级应用程序模板
2014/08/20 PHP
php实现删除指定目录下相关文件的方法
2014/10/20 PHP
服务器上配置PHP运行环境教程
2015/02/12 PHP
显示js对象所有属性和方法的函数
2009/10/16 Javascript
JavaScript随机排序(随即出牌)
2010/09/17 Javascript
一个页面元素appendchild追加到另一个页面元素的问题
2013/01/27 Javascript
JavaScript中的方法调用详细介绍
2014/12/30 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
jQuery实现模仿微博下拉滚动条加载数据效果
2015/12/25 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
pm2 部署 node的三种方法示例
2017/10/20 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
vue.js使用v-pre与v-html输出HTML操作示例
2018/07/07 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
webpack + vue 打包生成公共配置文件(域名) 方便动态修改
2019/08/29 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
pandas每次多Sheet写入文件的方法
2018/12/10 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
Python 依赖库太多了该如何管理
2019/11/08 Python
python numpy 反转 reverse示例
2019/12/04 Python
python实现银行实战系统
2020/02/26 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
python中time、datetime模块的使用
2020/12/14 Python
lookfantastic荷兰:在线购买奢华护肤、护发和化妆品
2018/11/27 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
小学生评语集锦
2014/04/18 职场文书
留学生求职信
2014/06/03 职场文书
2014年政风行风自查自纠报告
2014/10/21 职场文书
讲座新闻稿
2015/07/18 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
Python 如何安装Selenium
2021/05/06 Python
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers
GO中sync包自由控制并发示例详解
2022/08/05 Golang