使用 Babylonjs Sprites 精灵图 做模型标注

效果在这里插入图片描述

// 精灵图
import { SpriteManager, Sprite, Scene, PointerEventTypes } from "@babylonjs/core"
export class ImportSprite {
    static callBackMap = new Map();
    static addSprite(name: string, url: string, scene: Scene, callBack: Function) {
        const spriteManagerTrees = new SpriteManager(name, url, 2000, { width: 500, height: 500 }, scene);
        const tree2 = new Sprite(name, spriteManagerTrees);
        tree2.width = 20;
        tree2.height = 20;
        tree2.position.y = -50;
        spriteManagerTrees.isPickable = true;
        tree2.isPickable = true;
        if (typeof callBack == "function") {
            this.callBackMap.set(name,callBack)
        }
        return tree2
    }
    static removeAllSprite(scene: Scene) {
        if(!Array.isArray(scene.spriteManagers)){
            return;
        }
   		//拷贝一下
        let list = scene.spriteManagers.map(item=>item);
        if(list.length == 0) return;
        const length = list.length;
        for (let index = 0; index < length; index++) {
            //移除事件
            let name = list[index].name;
            this.callBackMap.has(name) && this.callBackMap.delete(name)
            list[index].dispose()

        }
    }
    static runCallBack(name:string){
        if(this.callBackMap.has(name)){
            this.callBackMap.get(name)(name)
        }
    }
}
//使用 
	const sprite = ImportSprite.addSprite("名称", "图片地址", scene, "点击精灵图触发函数");
	//修改精灵图参数; mesh为需要标注的模型
    sprite.width = sprite.height = 5;
    sprite.position = mesh.position;
 //事件触发方式
 //1.给 scene 添加 事件监听
 scene.onPointerObservable.add(sceneClick, PointerEventTypes.POINTERDOWN)
 //2.触发 判断是否点击精灵图 点击则调用 类 ImportSprite 的 runCallBack方法 
 //pickResult.pickedSprite.name 值 和 addSprite名称参数相同
 const sceneClick = (e) => {
    let pickResult = scene.pickSprite(scene.pointerX, scene.pointerY);
    if (pickResult != null && pickResult.hit) {
        ImportSprite.runCallBack(pickResult.pickedSprite.name)  
    }
}
        
        
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Howler.jsSprites(精灵)功能可以让你将一个音频文件分割成多个小段,并在需要时播放其中的任意一段。这个功能常用于游戏开发、音频编辑等场景中。 使用Sprites功能,你可以在创建一个音频实例时指定一个包含多个片段的对象,每个片段都有唯一的键名和开始/结束时间。例如: ```js var sound = new Howl({ src: ['audio.mp3'], sprite: { intro: [0, 5000], // 从0秒开始,持续5秒 verse: [5000, 15000], // 从5秒开始,持续15秒 chorus: [20000, 10000] // 从20秒开始,持续10秒 } }); ``` 在上面的代码中,我们创建了一个名为`sound`的音频实例,并在`sprite`属性中定义了三个片段,分别为`intro`、`verse`和`chorus`。每个片段都用一个数组表示,数组的第一个元素是该片段开始的时间(以毫秒为单位),第二个元素是该片段结束的时间(同样以毫秒为单位)。 然后,当需要播放某个片段时,你可以使用`play`方法,并指定要播放的片段的键名。例如: ```js // 播放intro片段 sound.play('intro'); // 暂停当前播放,并播放chorus片段 sound.pause(); sound.play('chorus'); ``` 在上面的代码中,我们分别使用`play`方法播放了`intro`和`chorus`两个片段,并使用`pause`方法暂停了当前播放的片段。这样,你就可以根据需要随时播放不同的音频片段了。 另外,你还可以使用`seek`方法和`duration`属性来控制播放位置和片段持续时间。例如,要从某个片段的中间位置开始播放,可以这样: ```js // 将播放位置设置为intro片段的中间位置,然后继续播放 sound.seek(2500); // 单位为毫秒 sound.play(); ``` 上面的代码中,我们使用`seek`方法将播放位置设置为`intro`片段的中间位置(即2.5秒处),然后调用`play`方法继续播放。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值