three.js 创建文本的几种方式


精灵贴图文本

.text {
      width: 128px;
      height: 128px;
      font-size: 16px;
      text-align: center;
      color: #ffffff;
      background: #ff0000;
    }

 <div class="text" id="text">精灵贴图文本</div>
  <div class="text" id="text2">平面贴图文本</div>
  <div class="text" id="text3">CSS2DRenderer渲染文本</div>
  <div class="text" id="text4">CSS3DRenderer CSS3DObject渲染文本</div>
  <div class="text" id="text5">CSS3DRenderer CSS3DSprite渲染文本</div>



  let div1 = document.getElementById('text');
  let div2 = document.getElementById('text2');
  let div3 = document.getElementById('text3');
  let div4 = document.getElementById('text4');
  let div5 = document.getElementById('text5');


	html2canvas(div1).then(canvas => {
	    let texture = new THREE.CanvasTexture(canvas);
	    let material = new THREE.SpriteMaterial({
	      map: texture
	    });
	    let sprite = new THREE.Sprite(material);
	    sprite.scale.set(4, 4, 1);
	    scene.add(sprite)
  })


平面贴图文本

html2canvas(div2).then(canvas => {
	    let texture = new THREE.CanvasTexture(canvas);
	    let material = new THREE.MeshBasicMaterial({
	      map: texture,
	      side: THREE.DoubleSide
	    });
	    let geometry = new THREE.PlaneGeometry(4, 4, 2);
	    let plane = new THREE.Mesh(geometry, material);
	    plane.position.set(10, 0, 0);
	    scene.add(plane)
  })

CSS2DRenderer

let label2DRenderer = new THREE.CSS2DRenderer();
  label2DRenderer.setSize(window.innerWidth, window.innerHeight);
  label2DRenderer.domElement.style.position = 'absolute';
  label2DRenderer.domElement.style.top = '0px';
  label2DRenderer.domElement.style.left = '0px';
  //设置.pointerEvents=none,以免模型标签HTML元素遮挡鼠标选择场景模型
  label2DRenderer.domElement.style.pointerEvents = 'none';
  document.body.appendChild(label2DRenderer.domElement);

let label2D = new THREE.CSS2DObject(div3);
  label2D.position.set(-10, 0, 0);
  scene.add(label2D);

label2DRenderer.render(scene, camera)

CSS3DRenderer

 let label3DRenderer = new THREE.CSS3DRenderer();
  label3DRenderer.setSize(window.innerWidth, window.innerHeight);
  label3DRenderer.domElement.style.position = 'absolute';
  label3DRenderer.domElement.style.top = '0px';
  label3DRenderer.domElement.style.left = '0px';
  //设置.pointerEvents=none,以免模型标签HTML元素遮挡鼠标选择场景模型
  label3DRenderer.domElement.style.pointerEvents = 'none';
  document.body.appendChild(label3DRenderer.domElement);

 let label3DObject = new THREE.CSS3DObject(div4);
  label3DObject.position.set(-20, 0, 0);
  label3DObject.scale.set(0.05, 0.05, 0.05);
  scene.add(label3DObject);

  let label3DSprite = new THREE.CSS3DSprite(div5);
  label3DSprite.position.set(-30, 0, 0);
  label3DSprite.scale.set(0.05, 0.05, 0.05);
  scene.add(label3DSprite);

label3DRenderer.render(scene, camera)

总结

CSS2DRenderer渲染的文本的大小不会随着缩放而改变,会一直保持原大小,其余的均会对应的改变大小
CSS3DRenderer渲染的CSS3DSprite 和精灵模型渲染的文本始终会面朝屏幕,不会随着旋转而改变角度。CSS3DRenderer渲染的CSS3DObject 和平面渲染的文本会随着角度的改变而改变
添加事件的方式不同,CSS3DRenderer和CSS2DRenderer渲染的本质还是dom,可以直接添加dom事件,精灵模型和mesh则是要通过射线的方式。
在渲染大批量文本的时候使用CSS3DRenderer和CSS2DRenderer性能最佳,将html转化为canvas这个步骤消耗的性能很大,如果直接是生成的canvas进行贴图则无所谓。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜡笔小先

你的鼓励是我创作的最佳动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值