视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Three.js实现绘制字体模型示例代码
2020-11-27 22:28:57 责编:小采
文档

前言

本文主要给大家介绍了关于利用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> 

    总结

    下载本文
    显示全文
    专题