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 相关文章推荐
js 通过cookie实现刷新不变化树形菜单
Oct 30 Javascript
js打造数组转json函数
Jan 14 Javascript
1秒50万字!js实现关键词匹配
Aug 01 Javascript
jQuery easyui刷新当前tabs的方法
Sep 23 Javascript
easyUI实现(alert)提示框自动关闭的实例代码
Nov 07 Javascript
详解vue-cli 构建Vue项目遇到的坑
Aug 30 Javascript
基于Vue.js 2.0实现百度搜索框效果
Dec 28 Javascript
Vue2.0结合webuploader实现文件分片上传功能
Mar 09 Javascript
Babel 入门教程学习笔记
Jun 13 Javascript
Vue瀑布流插件的使用示例
Sep 19 Javascript
vue基于viewer实现的图片查看器功能
Apr 12 Javascript
JavaScript 俄罗斯方块游戏实现方法与代码解释
Apr 08 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
JAVA/JSP学习系列之二
2006/10/09 PHP
Windows2003 下 MySQL 数据库每天自动备份
2006/12/21 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
php单文件版在线代码编辑器
2015/03/12 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
2015/11/30 PHP
thinkphp3.x中session方法的用法分析
2016/05/20 PHP
浅谈Laravel POST,PUT,PATCH 路由的区别
2019/10/15 PHP
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
解析Node.js异常处理中domain模块的使用方法
2016/02/16 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
vue.js中Vue-router 2.0基础实践教程
2017/05/08 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
解决vue项目运行npm run serve报错的问题
2020/10/26 Javascript
python定时采集摄像头图像上传ftp服务器功能实现
2013/12/23 Python
Python多线程编程(四):使用Lock互斥锁
2015/04/05 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
Python+matplotlib+numpy实现在不同平面的二维条形图
2018/01/02 Python
python数据分析数据标准化及离散化详解
2018/02/26 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
Python 读取有公式cell的结果内容实例方法
2020/02/17 Python
Python中无限循环需要什么条件
2020/05/27 Python
Python图像处理二值化方法实例汇总
2020/07/24 Python
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
英国最大的百货公司:Harrods
2016/08/18 全球购物
Darphin迪梵官网: 来自巴黎,植物和精油调制的护肤品牌
2016/10/11 全球购物
业务经理的岗位职责
2013/11/16 职场文书
旅游项目开发策划书
2014/01/18 职场文书
运动会稿件200字
2014/02/07 职场文书
趣味运动会策划方案
2014/06/02 职场文书
幼儿园六一儿童节主持词
2015/06/30 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
SQL SERVER中的流程控制语句
2022/05/25 SQL Server