Three.js学习之文字形状及自定义形状


Posted in Javascript onAugust 01, 2016

1.文字形状

说起3d文字想起了早年word里的一些艺术字:

Three.js学习之文字形状及自定义形状

那么TextGeometry可以用来创建三维的文字形状。

使用文字形状需要下载和引用额外的字体库。这里,我们以 helvetiker字体为例。

引用:

<script type="text/javascript" src="你的路径/helvetiker_regular.typeface.json"></script>

TextGeometry的构造函数是:

THREE.TextGeometry(text, parameters)

text是文字字符串;

parameters是以下参数组成的对象:

· size:字号大小,一般为大写字母的高度

· height:文字的厚度

· curveSegments:弧线分段数,使得文字的曲线更加光滑

· font:字体,默认是'helvetiker',需对应引用的字体文件

· weight:值为'normal'或'bold',表示是否加粗

· style:值为'normal'或'italics',表示是否斜体

· bevelEnabled:布尔值,是否使用倒角,意为在边缘处斜切

· bevelThickness:倒角厚度

· bevelSize:倒角宽度

创建一个三维文字:new THREE.TextGeometry('Hello', {size: 1, height: 1}),其效果为:

 Three.js学习之文字形状及自定义形状

可以适当调整材质和光照以达到期望效果:

//金属发亮物体
var material = new THREE.MeshPhongMaterial({  
  color: 0xffff00,
  specular:0xffff00,  
  //指定该材质的光亮程度及其高光部分的颜色,如果设置成和color属性相同的颜色,则会得到另一个更加类似金属的材质,如果设置成grey灰色,则看起来像塑料
  shininess:0    
  //指定高光部分的亮度,默认值为30
});
        
//方向光
var light = new THREE.DirectionalLight(0xffffff);
light.position.set(-5, 10, 5);
scene.add(light);

Three.js学习之文字形状及自定义形状

源码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>3.js测试六</title>
  </head>
  <body onload="init()">
    <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
  </body>
  <script type="text/javascript" src="js/three.min.js"></script>
    <!-- Find more information at https://github.com/mrdoob/three.js/tree/master/examples/fonts -->
    
    <script type="text/javascript">
      function init() {
        var renderer = new THREE.WebGLRenderer({
          canvas: document.getElementById('mainCanvas')
        });
        renderer.setClearColor(0x000000);
        var scene = new THREE.Scene();
        
        // camera
        var camera = new THREE.OrthographicCamera(-2.5, 2.5, 1.875, -1.875, 0.1, 100);
        camera.position.set(5, 5, 20);
        camera.lookAt(new THREE.Vector3(1, 0, 0));
        scene.add(camera); 
        
//       var material = new THREE.MeshBasicMaterial({
//         color: 0xffff00,
//         wireframe: true
//       });
        //金属发亮物体
        var material = new THREE.MeshPhongMaterial({  
          color: 0xffff00,
          specular:0xffff00,  
          //指定该材质的光亮程度及其高光部分的颜色,如果设置成和color属性相同的颜色,则会得到另一个更加类似金属的材质,如果设置成grey灰色,则看起来像塑料
          shininess:0    
          //指定高光部分的亮度,默认值为30
        });
        
        //方向光
        var light = new THREE.DirectionalLight(0xffffff);
        light.position.set(-5, 10, 5);
        scene.add(light);

        // load font
        var loader = new THREE.FontLoader();
        loader.load('./helvetiker_regular.typeface.json', function(font) {
          var mesh = new THREE.Mesh(new THREE.TextGeometry('Hello', {
            font: font,
            size: 1,
            height: 1
          }), material);
          scene.add(mesh);
          
          // render
          renderer.render(scene, camera);
        });
      }
      
    </script>
</html>

2.自定义形状

对于Three.js没有提供的形状,可以提供自定义形状来创建。

由于自定义形状需要手动指定每个顶点位置,以及顶点连接情况,如果该形状非常复杂,程序员的计算量就会比较大。在这种情况下,建议在3ds Max之类的建模软件中创建模型,然后使用Three.js导入到场景中,这样会更高效方便。

自定义形状使用的是Geometry类,它是其他如CubeGeometrySphereGeometry等几何形状的父类,其构造函数是:

THREE.Geometry()

初始化一个几何形状,然后设置顶点位置以及顶点连接情况:

 Three.js学习之文字形状及自定义形状

源码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>3.js测试六-二</title>
  </head>
  <body onload="init()">
    <canvas id="mainCanvas" width="400px" height="300px" ></canvas>
  </body>
  <script type="text/javascript" src="js/three.js"></script> 
  <script type="text/javascript">
    function init() {
      var renderer = new THREE.WebGLRenderer({
        canvas: document.getElementById('mainCanvas')
      });
      renderer.setClearColor(0x000000);
      var scene = new THREE.Scene();
      
      // camera
      var camera = new THREE.OrthographicCamera(-5, 5, 3.75, -3.75, 0.1, 100);
      camera.position.set(25, 25, 25);
      camera.lookAt(new THREE.Vector3(0, 0, 0));
      scene.add(camera);
      
      var material = new THREE.MeshBasicMaterial({
        color: 0xffff00,
        wireframe: true
      });
      
      // 初始化几何形状
      var geometry = new THREE.Geometry();
      
      // 设置顶点位置
      // 顶部4顶点
      geometry.vertices.push(new THREE.Vector3(-1, 2, -1));
      geometry.vertices.push(new THREE.Vector3(1, 2, -1));
      geometry.vertices.push(new THREE.Vector3(1, 2, 1));
      geometry.vertices.push(new THREE.Vector3(-1, 2, 1));
      // 底部4顶点
      geometry.vertices.push(new THREE.Vector3(-2, 0, -2));
      geometry.vertices.push(new THREE.Vector3(2, 0, -2));
      geometry.vertices.push(new THREE.Vector3(2, 0, 2));
      geometry.vertices.push(new THREE.Vector3(-2, 0, 2));
      
      // 设置顶点连接情况
      // 顶面
      geometry.faces.push(new THREE.Face3(0, 1, 3));
      geometry.faces.push(new THREE.Face3(1, 2, 3));
//     geometry.faces.push(new THREE.Face4(0, 1, 2, 3));
      // 底面
      geometry.faces.push(new THREE.Face3(4, 5, 6));
      geometry.faces.push(new THREE.Face3(5, 6, 7));
//     geometry.faces.push(new THREE.Face4(4, 5, 6, 7));
      // 侧面
      geometry.faces.push(new THREE.Face3(1, 5, 6));
      geometry.faces.push(new THREE.Face3(6, 2, 1));
      geometry.faces.push(new THREE.Face3(2, 6, 7));
      geometry.faces.push(new THREE.Face3(7, 3, 2));
      geometry.faces.push(new THREE.Face3(3, 7, 0));
      geometry.faces.push(new THREE.Face3(7, 4, 0));
      geometry.faces.push(new THREE.Face3(0, 4, 5));
      geometry.faces.push(new THREE.Face3(0, 5, 1));
//      // 四个顶点组成的面
//      geometry.faces.push(new THREE.Face4(0, 1, 5, 4)); 
//      geometry.faces.push(new THREE.Face4(1, 2, 6, 5)); 
//      geometry.faces.push(new THREE.Face4(2, 3, 7, 6)); 
//      geometry.faces.push(new THREE.Face4(3, 0, 4, 7));
      
      var mesh = new THREE.Mesh(geometry, material);
      scene.add(mesh);
      
      // render
      renderer.render(scene, camera);
    }
  </script>
</html>

需要注意的是,new THREE.Vector3(-1, 2, -1)创建一个矢量,作为顶点位置追加到geometry.vertices数组中。

而由new THREE.Face3(0, 1, 2)创建一个三个顶点组成的面,追加到geometry.faces数组中。三个参数分别是三个顶点在geometry.vertices中的序号。如果需要设置由四个顶点组成的面片,可以类似地使用THREE.Face4

//顶面
geometry.faces.push(new THREE.Face4(0, 1, 2, 3));
//底面
geometry.faces.push(new THREE.Face4(4, 5, 6, 7));
//四个侧面
geometry.faces.push(new THREE.Face4(0, 1, 5, 4));
geometry.faces.push(new THREE.Face4(1, 2, 6, 5));
geometry.faces.push(new THREE.Face4(2, 3, 7, 6));
geometry.faces.push(new THREE.Face4(3, 0, 4, 7));

Three.js学习之文字形状及自定义形状

以上就是小编为大家整理的Three.js学习之文字形状及自定义形状的全部内容,之前小编也整理了几篇关于Three.js的相关文章,有需要的可以通过下面相关文章的链接查看,希望能帮到学习Three.js的大家。

Javascript 相关文章推荐
JavaScript中的console.profile()函数详细介绍
Dec 29 Javascript
jQuery实现表单步骤流程导航代码分享
Aug 28 Javascript
jQuery Validate插件实现表单验证
Aug 19 Javascript
AngularJS bootstrap启动详解及实例代码
Sep 14 Javascript
深入理解requestAnimationFrame的动画循环
Sep 20 Javascript
性能优化之代码优化页面加载速度
Mar 01 Javascript
vue中使用vue-router切换页面时滚动条自动滚动到顶部的方法
Nov 28 Javascript
JS实现简单获取最近7天和最近3天日期的方法
Apr 18 Javascript
如何自动化部署项目?折腾服务器之旅~
Apr 16 Javascript
vue+element表格导出为Excel文件
Sep 26 Javascript
JS数组reduce()方法原理及使用技巧解析
Jul 14 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
Sep 16 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
Aug 01 #Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
Aug 01 #Javascript
基于原生JS实现图片裁剪
Aug 01 #Javascript
AngularJS基础 ng-include 指令简单示例
Aug 01 #Javascript
jQuery实现的表头固定效果实例【附完整demo源码下载】
Aug 01 #Javascript
AngularJS基础 ng-if 指令用法
Aug 01 #Javascript
AngularJS控制器之间的数据共享及通信详解
Aug 01 #Javascript
You might like
4.与数据库的连接
2006/10/09 PHP
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
php实现有趣的人品测试程序实例
2015/06/08 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
thinkPHP5 ACL用户权限模块用法详解
2017/05/10 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
23个Javascript弹出窗口特效整理
2011/02/25 Javascript
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
js登录弹出层特效
2014/03/07 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
2015/11/26 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
2017/01/03 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
2017/05/05 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
Python中apply函数的用法实例教程
2014/07/31 Python
python bmp转换为jpg 并删除原图的方法
2018/10/25 Python
Pyqt5 基本界面组件之inputDialog的使用
2019/06/25 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
Django中的静态文件管理过程解析
2019/08/01 Python
使用python快速实现不同机器间文件夹共享方式
2019/12/22 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
欧洲最大的拼图游戏商店:JigsawPuzzle.co.uk
2018/07/04 全球购物
广告学专业应届生求职信
2013/10/01 职场文书
函授本科自我鉴定
2014/02/04 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
2015年防汛工作总结
2015/05/15 职场文书
使用CSS实现一个搜索引擎的原理解析
2021/09/25 HTML / CSS
Python&Matlab实现灰狼优化算法的示例代码
2022/03/21 Python