threejs绘制中文方案

1. 创建文字几何体

使用threejs自带的helvetiker_bold.typeface字体文件来进行渲染,仅支持渲染英文

export class Text {
  static font: Font;

  data: Mesh;

  static async getFont() {
    if(!this.font) {
      const loader = new FontLoader();
      this.font = await loader.loadAsync('fonts/helvetiker_bold.typeface.json');
    }
    return this.font;
  }

  async setText(text: string) {
    const font = await Text.getFont();
    const geometry = new TextGeometry(text, {
      font: font,
      size: 80,
      height: 5,
      curveSegments: 12,
      bevelEnabled: true,
      bevelThickness: 10,
      bevelSize: 8,
      bevelOffset: 0,
      bevelSegments: 5
    });
    const material = new MeshLambertMaterial({ color: 0x0000ff });
    this.data = new Mesh(geometry, material);
  }
}
渲染英文

自带的 helvetiker_bold 字体并不支持中文,需要找个 ttf 中文字体在 http://gero3.github.io/facetype.js/ 上转换为TypeFace格式,这里以阿里普惠体为例,渲染效果如下

阿里普惠体

但是有两个缺点:

  1. 需要额外加载字体文件,中文字体文件大小高达41.3M,实际使用的话需要对字体文件进行裁剪
  2. 无法渲染emoji表情,都会被渲染为?

2. 使用CSS2DRenderer直接渲染dom

threejs不仅提供了3d渲染器,还提供了把dom元素渲染在3d场景的CSS2DRenderer渲染器

    // CSS2DRenderer
    this.labelRenderer = new CSS2DRenderer();
    this.labelRenderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(this.labelRenderer.domElement);

    // CSS2DObject
    this.scene = new Scene();
    const div = document.createElement("div");
    div.className = "label";
    div.textContent = text;
    this.text= new CSS2DObject(div);
    this.scene.add(this.text);

优点:这样渲染出来的都是真实的dom节点,可以很方便的编写交互逻辑,如果只需要平面的文字,这一方面明显比创建文字几何体更好
缺点:缩放相机时,dom节点没有缩放效果,这个时候可以考虑使用CSS3DRenderer

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容