Pixi.js的魅力

news2024/9/23 15:32:37

在这里插入图片描述

摘要:官网

Web开发的时代,图形和动画已经成为了吸引用户注意力的重要手段之一。而 Pixi.js 作为一款高效、易用的2D渲染引擎,已经成为了许多开发者的首选~~
项目中,有一些图像的处理操作(3D图,2D图都有),其中3D图也是通过获取后端服务的图像2D数据进行绘制展示,通过鼠标各种操作调用后端服务来进行重新获取新图数据。这里前端设计到图像的操作使用了PIXIJS

pixijs的最关键的三个对象:
Application:这个是用来创建Pixi应用的。PIXI.Application会自动选择使用Canvas或者是WebGL来渲染图形,这取决于您的浏览器支持情况。PIXI.Application有一个options对象,可以设置一些参数,比如显示的区域的宽,高,,透明度,分辨率等等等。具体官网有很详细说明。
stage:来自PixiJS中文网的解释,stage(舞台)是Pixi的Container(容器)对象。你可以把一个Container(容器)想象成一种空盒子,它会把你放进去的东西组合在一起并储存起来。stage(舞台)对象是场景中所有可见事物的根容器。你在stage(舞台)里放的任何东西都会在canvas画面上渲染出来,。
sprite:sprite(精灵)是一种的特殊图像对象。您可以控制它们的位置、大小和其他属性,

总体的理解和使用步骤就是:首先用Application创建Pixi应用,当创建了Pixi应用后,舞台容器也就自动创建了,可以理解为容器就是一个用来存放物体的东西,比如我们现实中的存钱罐,收纳箱,衣柜什么的。可以通过应用对象访问到舞台。光有舞台这个容器后,我们就是需要将物体放入进去,这里的物体一般就是我们需要操作的图像。我们通过sprite来加入进来。当然图像渲染中自然少不了图像纹理一说,可以使用YIPixi的loader加载图像纹理并创建精灵,然后将其加入到Pixi的容器stage中,这样就完成了Pixi的整个基本的过程。

在vue3中使用的PixiJS,第一步创建Pixi应用,关键代码如下:

import * as PIXI from 'pixi.js'; 
import '@pixi/unsafe-eval' 
let Pixi = new PIXI.Application({width:800,height:800});

将Pixi应用加入到页面元素中展示。将Pixi加入到页面的的元素中,这里“DivLeft3d”是我页面中的一个div元素。,即在onMounted的勾子函数中调用如下代码:

document.getElementById("DivLeft3d").appendChild(Pixi.view);

创建sprite并将其加入到Pixi的容器中进行展示:我这里的示例代码中是直接加载的图像的二进制byte[]数据,注意Pixi的图像数据格式是RGBA格式的。我之前这里的数据格式BGRA的,导致显示的图像一直是一个颜色,捣鼓了一天才找到原因。针对Pixi的鼠标事件,dataIndex是我的自定义参数,如果这里不需要参数,可以直接用js箭头函数。还有就是我这里事件是卸载精灵上的,也可以写在舞台stage上来触发,具体看各自使用。

function pixiLoadImg(dataIndex, imagedata) {
        let pixelData = new Uint8Array(imagedata);
        let sprite = PIXI.Sprite.from(PIXI.Texture.fromBuffer(pixelData, 800, 800, {
            resourceOptions: {
                width: 800, height: 800, format: 6408
            }
        }));
        //对于有事件的精灵,通常需要设置sprite.interactive = true , 对于作按钮用的精灵,需要设置sprite.buttonMode = true;
        sprite.buttonMode = true;
        sprite.interactive = true;
        //sprite.anchor.set(0.5) //设置锚点在中间

        //这里是针对精灵的一些鼠标事件。
        sprite.on('pointerdown', (event) => { PIXImousedown(dataIndex, event) })
            .on('pointerup', (event) => { PIXImouseup(dataIndex, event) })
            .on('pointermove', (event) => { PIXImousemove(dataIndex, event) })
            .on('pointerover', (event) => { PIXImouseover(dataIndex, event) })
            .on('pointerout', (event) => { PIXImouseout(dataIndex, event) })

        console.log("添加Pixi数据")
        Pixi.stage.removeChildren();
        Pixi.stage.addChild(sprite);
    }

另外需要注意的是在Pixi上是没有mousewheel事件的。这个我们可以在更外层的元素上触发这个事件,或者在整个window上监听这个事件,然后判断是否是Pixi上的操作即可,这里是中键进行缩放操作。参考代码类似:

window.addEventListener("mousewheel", (event) => {
        console.log("mousewheel");
        const step = event.wheelDelta > 0 ? 0.1 : -0.1
        //event.preventDefault(); //阻止事件冒泡
        if (selectDataIndex > 0) {
            proxy.$axios.post(proxy.GLOBAL.baseUrl + 'Hear/MouseWheel',
                { "dataIndex": selectDataIndex, "delta": event.deltaY })
                .then((res) => {
                    let byteBuffer = _base64ToArrayBuffer(res.data.base64Image);
                    //缩放图像
                    pixiLoadImg(selectDataIndex, byteBuffer);
                }).catch((res) => {
                    alert("MouseMove异常");
                    console.log(res);
                });
        }
    })

最后,附带获取鼠标在Pixi上的坐标位置的方法:
如果我们是用Pixi的精灵来触发的,通过事件参数来获取到位置信息:event.data.getLocalPosition(event.currentTarget.parent);,类似let currentPosition=event.data.getLocalPosition(event.currentTarget.parent);其中currentPosition.x和currentPosition.y就是对应的鼠标坐标:
如果是用Pixi的舞台上触发的,通过舞台上的事件参数来获取位置信息:event.data.globalX和event.data.globalY就是对应的鼠标位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1365221.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)

时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价) 目录 时序预测 | Matlab基于CNN-LSTM-SAM卷积神经网络-长短期记忆网络结合空间注意力机制的时间序列预测(多指标评价)预测效果基本介绍程序设计参考资料 预测效果 …

npm 和 Yarn:一场关于包管理的战争(下)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C)) Baumer工业相机Baumer工业相机的图像高速保存的技术背景Baumer工业相机通过NEOAPI SDK函数图像高速保存在NEOAPI SDK里实现线程高速图像保存:工业相机高…

芯片验证入门踩坑指南(1)

因为一些原因,从华为数通C软件开发到海思这边做芯片验证,快一个月,说下一些心得与体会: 如何快速上手: 因为项目非常赶,几乎没有脱产学习时间,就是直接干项目,一开始不需要知道原理…

【leetcode】力扣热门之合并两个有序列表【简单难度】

题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 用例 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 输入:l1 [], l2 [] 输出:[] 输入:l1 []…

开源、云原生且实时分析型的现代数据仓库DataBend的介绍,及其与其它开源文件存储的结合使用实例

DataBend介绍 Databend 是一个开源、云原生且实时分析型的现代数据仓库,旨在提供高效的数据存储和处理能力。它采用 Rust 语言开发,并支持 Apache Arrow 格式以实现高性能列式存储与查询处理。 主要特点: 云原生设计:Databend 构…

[VUE]1-创建vue工程

目录 基于脚手架创建前端工程 1、环境要求 2、操作过程 3、工程结构 4、启动前端服务 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法&#xff0c…

即时战略游戏的AI策略思考

想起来第一次玩RTS游戏,就是框住一大群兵进攻,看他们把对面消灭干净……我接触的第一款游戏是《傲世三国》那会儿是小学,后来高中接触了魔兽地图编辑器,我发现自己喜欢直接看属性而省去争论和试验的步骤——我喜欢能一眼看透的感觉…

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网

20240107移远的4G模块EC20在Firefly的AIO-3399J开发板的Android11下调通能上网 2024/1/7 11:17 开发板:Firefly的AIO-3399J【RK3399】SDK:rk3399-android-11-r20211216.tar.xz【Android11】 Android11.0.tar.bz2.aa【ToyBrick】 Android11.0.tar.bz2.ab …

【Spring实战】25 Spring Boot Admin 应用

文章目录 1. 查看健康信息2. 使用 Micrometer 和 "/metrics"3. 管理包和类的日志级别4. 其他功能总结 Spring Boot Admin 是一个功能强大的工具,用于监控和管理多个 Spring Boot 应用程序。通过上一篇文章 【Spring实战】24 使用 Spring Boot Admin 管理…

Android getApplication()、getApplicationContext的区别

在Android中,getApplication()和getApplicationContext()是两种获取应用程序上下文的方法,但它们有一些细微的区别。 getApplication()方法: getApplication()方法通常用于Activity或Fragment中,它返回当前Activity或Fragment所属…

MySQL-存储引擎

简介:存储引擎是存储数据,建立索引,更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的, (同一个数据库的不同表可以选择不同的存储引擎) 所以存储引擎也可被称为表类型。 我们输入 SHOW CREATE TAB…

Django 10 表单

表单的使用流程 1. 定义 1. terminal 输入 django-admin startapp the_14回车 2. tutorial子文件夹 settings.py INSTALLED_APPS 中括号添加 "the_14", INSTALLED_APPS [django.contrib.admin,django.contrib.auth,django.contrib.contenttypes,django.contrib…

Kafka(五)生产者

目录 Kafka生产者1 配置生产者bootstrap.serverskey.serializervalue.serializerclient.id""acksallbuffer.memory33554432(32MB)compression.typenonebatch.size16384(16KB)max.in.flight.requests.per.connection5max.request.size1048576(1MB)receive.buffer.byte…

Fowsniff

靶场搭建 遇到扫描不到的情况,可以尝试改靶机的网络为NAT模式,在靶机启动时按”esc“,进入Advanced options for Ubantu,选择recovery mode,选择network,按方向键”→“,OK,然后res…

Python爬虫获取百度的图片

一. 爬虫的方式: 主要有2种方式: ①ScrapyXpath (API 静态 爬取-直接post get) ②seleniumXpath (点击 动态 爬取-模拟) ScrapyXpath XPath 是 Scrapy 中常用的一种解析器,可以帮助爬虫定位和提取 HTML 或 XML 文档中的数据。 Scrapy 中使用 …

VMware NAT 模式,网关无法ping通 网关解决办法

开启红框服务即可。。 参考:VMware NAT 模式,网关无法ping通 网关解决办法_vmware设置net,本机ping不通网关-CSDN博客

【代码】Keras3.0:实现残差连接

简介 残差连接是一种非常重要的网络结构创新,最早被广泛应用于ResNet(Residual Neural Network)模型中,由何凯明等人在2015年的论文"Deep Residual Learning for Image Recognition"中提出。 核心思想 通过引入“short…

【Sharding-Sphere 整合SpringBoot】

Sharding-Jdbc在3.0后改名为Sharding-Sphere。Sharding-Sphere相关资料,请自行网上查阅,这里仅仅介绍了实战相关内容,算是抛砖引玉。 Sharding-Sphere 整合SpringBoot 一、项目准备二、项目实战1. pom.xml及application.yml2. OrderInfoCont…

大数据 Yarn - 资源调度框架

Hadoop主要是由三部分组成,除了前面我讲过的分布式文件系统HDFS、分布式计算框架MapReduce,还有一个是分布式集群资源调度框架Yarn。 但是Yarn并不是随Hadoop的推出一开始就有的,Yarn作为分布式集群的资源调度框架,它的出现伴随着…