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 相关文章推荐
IE6弹出“已终止操作”的解决办法
Nov 27 Javascript
jquery 插件学习(五)
Aug 06 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
Mar 29 Javascript
使用jquery获取网页中图片高度的两种方法
Sep 26 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
Dec 16 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
js oncontextmenu事件使用详解
Mar 25 Javascript
Angular4 中内置指令的基本用法
Jul 31 Javascript
JS分页的实现(同步与异步)
Sep 16 Javascript
vue draggable resizable 实现可拖拽缩放的组件功能
Jul 15 Javascript
Element InputNumber 计数器的实现示例
Aug 03 Javascript
Jquery Fade用法详解
Nov 06 jQuery
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依赖倒置(Dependency Injection)代码实例
2014/10/11 PHP
PHP实现事件机制的方法
2015/07/10 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
JavaScript splice()方法详解
2020/09/22 Javascript
jquery中map函数遍历数组用法实例
2015/05/18 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
Angular 理解module和injector,即依赖注入
2016/09/07 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
Angualrjs和bootstrap相结合实现数据表格table
2017/03/30 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
Angular使用Md5加密的解决方法
2017/09/16 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
angular 数据绑定之[]和{{}}的区别
2018/09/25 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
2019/01/10 Javascript
Vue.js仿Select下拉框效果
2020/02/18 Javascript
JavaScript利用键盘码控制div移动
2020/03/19 Javascript
Python矩阵常见运算操作实例总结
2017/09/29 Python
利用scrapy将爬到的数据保存到mysql(防止重复)
2018/03/31 Python
对python3中pathlib库的Path类的使用详解
2018/10/14 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
python map比for循环快在哪
2020/09/21 Python
纯CSS3实现的阴影效果
2014/12/24 HTML / CSS
css 元素选择器的简单实例
2016/05/23 HTML / CSS
将SVG图引入到HTML页面的实现
2019/09/20 HTML / CSS
印度最大的时尚购物网站:Myntra
2018/09/13 全球购物
大学生专业个人学习的自我评价
2013/10/26 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
批评与自我批评总结
2014/10/17 职场文书
女儿满月酒致辞
2015/07/29 职场文书
担保公司2015年终工作总结
2015/10/14 职场文书
保险公司岗前培训工作总结
2015/10/24 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
js中Object.create实例用法详解
2021/10/05 Javascript
css样式important规则的正确使用方式
2022/06/10 HTML / CSS