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 相关文章推荐
jquery.lazyload  实现图片延迟加载jquery插件
Feb 06 Javascript
js动态创建表格,删除行列的小例子
Jul 20 Javascript
Javascript页面添加到收藏夹的简单方法
Aug 07 Javascript
JS循环遍历JSON数据的方法
Jul 08 Javascript
js实现仿QQ秀换装效果的方法
Mar 04 Javascript
JS实现简单的二维矩阵乘积运算
Jan 26 Javascript
浅谈javascript中的call、apply、bind
Mar 06 Javascript
解决JS内存泄露之js对象和dom对象互相引用问题
Jun 25 Javascript
微信web端后退强制刷新功能的实现代码
Mar 04 Javascript
JS实现查找数组中对象的属性值是否存在示例
May 24 Javascript
微信小程序页面上下滚动效果
Nov 18 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
Sep 21 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
如何用phpmyadmin设置mysql数据库用户的权限
2012/01/09 PHP
使用php发送有附件的电子邮件-(PHPMailer使用的实例分析)
2013/04/26 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
apache php mysql开发环境安装教程
2016/07/28 PHP
微信自定义菜单的创建/查询/取消php示例代码
2016/08/05 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
jQuery textarea的长度进行验证
2009/05/06 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
jQuery中live()方法用法实例
2015/01/19 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
深入浅析JavaScript中的3DES
2016/08/24 Javascript
JavaScript 最佳实践:帮你提升代码质量
2016/12/03 Javascript
jQuery实现鼠标经过显示动画边框特效
2017/03/24 jQuery
Vue.js最佳实践(五招助你成为vuejs大师)
2018/05/04 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
详解express使用vue-router的history踩坑
2019/06/05 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
2019/08/20 Javascript
vue transition 在子组件中失效的解决
2019/11/12 Javascript
vue中的 $slot 获取插槽的节点实例
2019/11/12 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
Python的Flask站点中集成xhEditor文本编辑器的教程
2016/06/13 Python
浅谈Python中range和xrange的区别
2017/12/20 Python
python字符串替换re.sub()实例解析
2020/02/09 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
阳光体育:Sunny Sports(购买露营和远足设备)
2018/08/07 全球购物
中专生自荐信
2013/10/12 职场文书
客户表扬信范文
2014/01/10 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
Python开发五子棋小游戏
2022/04/28 Python
码云(gitee)通过git自动同步到阿里云服务器
2022/12/24 Servers