Sprite标签(Canvas作为贴图)批量标注设备模型

一、效果

二、第一步:canvas.js中封装canvas函数,生成一个canvas对象,标注文字为参数name

unction createCanvas(name) {
    /**
     * 创建一个canvas对象,绘制几何图案或添加文字
     */
    const canvas = document.createElement("canvas");
    const arr = name.split(""); //分割为单独字符串
    let num = 0;
    const reg = /[\u4e00-\u9fa5]/;
    for (let i = 0; i < arr.length; i++) {
        if (reg.test(arr[i])) { //判断是不是汉字
            num += 1;
        } else {
            num += 0.5; //英文字母或数字累加0.5
        }
    }
    // 根据字符串符号类型和数量、文字font-size大小来设置canvas画布宽高度
    const h = 80; //根据渲染像素大小设置,过大性能差,过小不清晰
    const w = h + num * 32;
    canvas.width = w;
    canvas.height = h;
    const h1 = h * 0.8;
    const c = canvas.getContext('2d');
    // 定义轮廓颜色,黑色半透明
    c.fillStyle = "rgba(0,0,0,0.5)";
    // 绘制半圆+矩形轮廓
    const R = h1 / 2;
    c.arc(R, R, R, -Math.PI / 2, Math.PI / 2, true); //顺时针半圆
    c.arc(w - R, R, R, Math.PI / 2, -Math.PI / 2, true); //顺时针半圆
    c.fill();
    // 绘制箭头
    c.beginPath();
    const h2 = h - h1;
    c.moveTo(w / 2 - h2 * 0.6, h1);
    c.lineTo(w / 2 + h2 * 0.6, h1);
    c.lineTo(w / 2, h);
    c.fill();
    // 文字
    c.beginPath();
    c.translate(w / 2, h1 / 2);
    c.fillStyle = "#ffffff"; //文本填充颜色
    c.font = "normal 32px 宋体"; //字体样式设置
    c.textBaseline = "middle"; //文本与fillText定义的纵坐标
    c.textAlign = "center"; //文本居中(以fillText定义的横坐标)
    c.fillText(name, 0, 0);
    return canvas;
}
export default createCanvas;

三、第二步:在sprite.js中单独封装一个精灵模型函数

import * as THREE from 'three';
import createCanvas from './canvas.js';
// 标注位置对应的模型对象obj
// name:标注文字
function createSprite(obj,name) {
    const canvas = createCanvas(name);//创建一个canvas画布
    // canvas画布作为CanvasTexture的参数创建一个纹理对象
    const texture = new THREE.CanvasTexture(canvas);
    const spriteMaterial = new THREE.SpriteMaterial({
      map: texture,
    });
    const sprite = new THREE.Sprite(spriteMaterial);
    const y = 4;//精灵y方向尺寸
    // sprite宽高比和canvas画布保持一致
    const x = canvas.width/canvas.height*y;//精灵x方向尺寸
    sprite.scale.set(x, y, 1);// 控制精灵大小
    sprite.position.y = y / 2; //标签底部箭头和空对象标注点重合  
    obj.add(sprite); //tag会标注在空对象obj对应的位置
}

四、第三步:在模型中调用精灵模型函数

import * as THREE from 'three';
// 引入gltf模型加载库GLTFLoader.js
import {
  GLTFLoader
} from 'three/addons/loaders/GLTFLoader.js';
import createSprite from './sprite.js'
const loader = new GLTFLoader(); //创建一个GLTF加载器
const model = new THREE.Group();

loader.load("../工厂.glb", function (gltf) {
  model.add(gltf.scene);
  createSprite(gltf.scene.getObjectByName('设备A标注'),'设备A');
  createSprite(gltf.scene.getObjectByName('设备B标注'),'设备B');
  createSprite(gltf.scene.getObjectByName('停车场标注'),'停车场');
})

export default model

在Three.js中,如果你想要将Sprite对象的材质设置为Canvas元素,你可以按照以下步骤操作: 1. **创建Canvas元素**: 首先,你需要在HTML中创建一个`<canvas>`标签,并通过JavaScript获取到它的引用,例如: ```javascript var canvas = document.createElement('canvas'); canvas.width = yourCanvasWidth; canvas.height = yourCanvasHeight; ``` 2. **绘制到Canvas上**: 创建一个`CanvasRenderer`和`WebGLRenderTarget`,并在循环中更新Canvas的内容。例如: ```javascript var renderer = new THREE.CanvasRenderer(); var renderTarget = new THREE.WebGLRenderTarget(canvas.width, canvas.height); function updateCanvasData() { // 在这里编写你的绘图代码 var ctx = canvas.getContext('2d'); ctx.fillStyle = 'red'; ctx.fillRect(0, 0, canvas.width, canvas.height); // 渲染到renderTarget renderer.render(scene, camera, renderTarget); } ``` 3. **将Canvas设为Material**: 创建一个`THREE.SpriteMaterial`,并设置其`map`属性为你创建的`renderTarget`: ```javascript var material = new THREE.SpriteMaterial({ map: renderTarget.texture, blending: THREE.AdditiveBlending, }); ``` 4. **创建和使用Sprite对象**: 现在可以创建一个Sprite对象并添加到场景中: ```javascript var sprite = new THREE.Sprite(material); scene.add(sprite); ``` 5. **定期更新Canvas内容**: 调用`updateCanvasData()`函数,在需要更新数据的地方,如游戏循环或动画帧。 **相关问题--:** 1. Three.js如何处理Canvas的纹理大小变化? 2. 如何在Sprite上应用透明度效果? 3. Sprite对象的position属性对Canvas材质有何影响?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值