Three.js之繪製中文文字並跟隨物體

本週更新的需求是物體上顯示文字信息,效果圖如下:

加載字體

import { FontLoader } from 'three/examples/jsm/loaders/FontLoader.js';

    const loader = new FontLoader();
    loader.load('/engine-static/fonts/FZCuHeiSongS-B-GB_Regular.json', (response) => {
      this.threeFont = response;
    });
  • 坑1:中文的字體,three.js的案例中都是英文的,使用英文字體,中文顯示就是???所以需要更換字體,打開電腦的字體庫 找個最小的ttf字體,然後去這個網站進行轉換成json格式,不可以本地引入,需要通過url可訪問的引入,所以放到項目的static文件夾中
    更改字體網站:http://gero3.github.io/facetype.js/

  • 坑2:字體比較大,加載需要時間,如果在字體加載前去創建文字會報錯,需要等字體加載成功後再繪製文字

創建字體

 let textGeo = new TextGeometry(text, {
          font: self.threeFont, // 字體
          size: 0.5, // 大小
          height: 0 // 是否是立體的文字,如果是2d的顯示就設置0
        });

        let textMaterials = new THREE.MeshBasicMaterial({ 
          color: 'red',  
          wireframe: false,
          transparent: true,
          opacity: 1, 
          side: THREE.DoubleSide
        })
        let textMesh = new THREE.Mesh(textGeo, textMaterials);
        textMesh.name = 'labelText';
           
        textMesh.position.set(0, (item.height / 1.95), 0); // 保持一點點的距離

        // 跟隨物體旋轉
        textMesh.rotation.z = -item.rotateZ;
        // 不跟隨物體擴大或者縮小 
        textMesh.scale.x = item.originWidth / item.width;    
        textMesh.scale.y = item.originHeight / item.height; 
        textMesh.scale.z = item.originDepth / item.depth;

        // 新增至於物體中
        wrapper.add(textMesh);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章