基于Qt的Live2D模型显示以及控制

基本说明

  1. Live2D官方提供有控制Live2D模型的SDK,而且还提供了一个基于OpenGL的C++项目Example,我们可以基于该项目改成Qt的项目,做一个桌面端的Live2D桌宠程序。

官方例子

  1. 经过改造效果如下图所示。

在这里插入图片描述

官方项目配置

  1. 下载官方提供的SDK例程,,选择Cubism SDK for Native。

    官方网站

在这里插入图片描述

  1. 下载解压后应该是下面的样子。

    在这里插入图片描述

    • 其中Core文件夹放的是核心库Live2DCubismCore的动态链接库,提供有各个平台,我们只需要用windows的链接库就可以了。

    • Framework提供基本的框架用于模型的读取和配置,我们可以使用源码也可以用它编译成的链接库。

    • Samples文件夹存放就是Example,里面有对应的脚本,可以生成VS项目。

  2. 生成VS项目

    • 进入Samples/OpenGL/Demo/proj.win.cmake/scripts目录下,根据你们安装的vs版本,选择对应的脚本进行项目生成。

      在这里插入图片描述

    • 在生成项目之前还需要配置一下第三方模块,不然无法生成。因为用到Opengl.所以需要glew和glfw模块。虽然官方有提供脚本一键配置,不过文件下载不了,我们需要手动下载配置。去github下载glfw和glew源码。

      • glew · GitHub

      • glfw · GitHub

      然后来到Samples/OpenGL/thirdParty目录下,解压刚才下载的两个文件,得到两个文件夹,文件夹名字记得修改为glew和glfw。配置完成如下所示。

      在这里插入图片描述

    • 配置完第三方模块后,使用项目脚本生成vs项目,打开脚本后,有一些选项可以配置,根据提示和自己需求配置即可。

      在这里插入图片描述

    • 如果之前的步骤没有错会在Samples/OpenGL/Demo/proj.win.cmake/目录生成build文件夹.我们打开里面的Demo.sln文件,即可在vs中运行项目。

      在这里插入图片描述

      点击运行项目,即可运行官方示例。

      在这里插入图片描述

      在vs中我们看到除了Demo项目,还有glew,glfw,framework项目,它们是用来生成链接库的,我们把他们设为启动项目然后生成一遍,得到对应链接库,之后我们要用的。glew会生成glew32.lib,libglew32.lib。glfw会生成glfw3.lib。framework会生成Framework.lib。

    • 至此我们就完成了第一步,跑起来官方的例程,之后想怎么改就怎么改。

准备移植Qt的文件

  1. 需要的链接库

    • 我们以Release,x64为环境,之前的链接库也按照这个模式生成。

    • 首先需要我们自己生成的链接库glew32.lib,libglew32.lib,glfw3.lib,Framework.lib。还有官方提供的Core链接库Live2DCubismCore_MD.lib/Live2DCubismCore_MT.lib。根据我们之前配置项目时的设置,选择MD或者MT即可。链接库在下载的SDK目录Core/lib/windows下,我们根据自己使用的vs版本选择对应的库,v143是Vs2022,v142是Vs2019,v141是Vs2017。

      在这里插入图片描述

    • 最后还需要主动链接一些系统库,这些需要的库我们可以在VS中查看Demo项目在属性页中的链接器看到。

      pragma comment(lib, "kernel32.lib")

      pragma comment(lib, "user32.lib")

      pragma comment(lib, "gdi32.lib")

      pragma comment(lib, "OpenGL32.lib")

      pragma comment(lib, "glu32.lib")

      在这里插入图片描述

  2. 需要的源代码

    • 我们需要在官方给出的控制代码中一些修改一些文件,改成适合Qt程序的。所需源码如下所示。

      在这里插入图片描述

    • 还有上面的链接库glfw,glew,Framework,Live2DCubismCore_MD.lib/Live2DCubismCore_MT.lib对应的头文件(*.h/*.hpp),以及stb_image.h文件。这些文件都可以在下载的SDK中找到。

移植Qt

Qt中有封装的OpenGL类(QOpenGLWidget),我们要做的就是把模型渲染在我们自己的OpenGL窗口上。
  1. 准备以上文件后我们用Qt Creator新建一个带界面UI文件的Qt程序,编译器使用MSVC对应的版本,名字叫Live2DDemo,然后把以上链接库,源文件,头文件添加到项目中。

  2. 添加完成后Qt工程如下所示

    在这里插入图片描述

    我们需要在mainwindow.h中手动链接一下这些库。

    pragma comment(lib, "kernel32.lib")

    pragma comment(lib, "user32.lib")

    pragma comment(lib, "gdi32.lib")

    pragma comment(lib, "OpenGL32.lib")

    pragma comment(lib, "glu32.lib")

    pro文件配置中加一个预定义宏,表示在WINDOWS平台

    DEFINES += CSM_TARGET_WIN_GL

    Framework的头文件直接把SDK中的Framework/src/目录下的所有文件直接复制过来就行,不用删除其中的cpp文件。GL和GLFW的文件夹名字不能改,因为它们源码就是以“GL/*.h"的方式包含的。如果更改了,需要去源码那里改一下头文件的包含。

    在这里插入图片描述

    项目的工程目录,inc目录存放头文件,libs存放链接库,live2d存放需要修改的代码。

    在这里插入图片描述

    配置根据各自的情况配置就行,其实就是配置一些头文件和链接库。

  3. 如果上面的配置都没有错,编译应该是可以通过的。如果有报错,根据报错提示修改即可。报错一般就是以下情况。

    • 头文件找不到。在工程文件Pro中加上缺少的即可,注意一下目录层级。

    • 链接库找不到。看看是不是x64,release,MSVC的编译环境,链接库是不是x64,release环境下生成的,链接库路径有没有写对。

修改源码

上面的配置都没有问题后,我们就可以开始修改,把Live2D模型渲染到Qt的QOpenGLWidget窗口上。

  1. 新建一个类MyOpenGL然后继承QOpenGLWidget,然后重写下面几个protected函数。

    void initializeGL()

    void resizeGL(int w, int h)

    void paintGL()

    下面几个头文件要放在cpp文件包含。

在这里插入图片描述

然后在mainwindow.ui界面拖拽一个QOpenGLWiget控件,提升为我们自定义的类MyOpenGL。如果一切都没有错,运行后就是下面的样子。

在这里插入图片描述

  1. 修改LAppDelegate类。

    • 在LAppDelegate.hpp中包含myopengl.h头文件,然后在public下新增两个函数声明。

      在这里插入图片描述

    • 注释原来的GLFWwindow*_window,改成MyOpenGL*_window。然后修改GetWindow函数。

      在这里插入图片描述

      在这里插入图片描述

    • Initialize()函数修改如下

      在这里插入图片描述

    • LAppDelegate.cpp

      • 在Initialize函数中做如下修改。

    在这里插入图片描述


     

    在这里插入图片描述

    在这里插入图片描述

    • Release函数修改如下

    在这里插入图片描述

    • void LAppDelegate::Run() 函数的所有内容注释掉,我们要把功能拆分到新增的resize()和update()函数中。两个函数如下

    在这里插入图片描述

    在这里插入图片描述

  2. 修改width和height的获取方式

    原来的代码中获取渲染窗口的宽和高是通过glfwGetWindowSize() 函数,但我们修改为了自己的OpenGL窗口,因此所有用到这个函数的地方都要修改。我们可以先编译一下看看哪里报错,然后跳到对应地方修改就可以了。需要修改的地方比较多就不一一截出来了,修改都是类似的。

    在这里插入图片描述

    在这里插入图片描述

  3. 修改我们自己的MyOPenGL类

    在这里插入图片描述

  4. 添加Resource

    • 下载的SDK中有官方提供的一些live2D模型,我们把整个Resources文件夹放到exe程序的上一级目录。因为在Qt Creator中运行程序,运行目录默认是exe程序的上一级目录。

    • 如果上面的步骤都没有错,运行出来的效果如下。如果程序闪退就是Resources文件夹放的位置不对,导致找不到文件而闪退。

      在这里插入图片描述

  5. 加上鼠标事件和定时更新功能

    鼠标事件用于和模型进行互动,可以触发一些特定动作

    在这里插入图片描述

    在这里插入图片描述

    到这里就基本和官方的效果差不多了,至于更多自定义修改,比如去掉背景和一些部件,模型的自定义显示,模型的切换等等,把那些控制代码看看,根据的需求修改即可。下载QtLive2dDesktop-master基于Qt的Live2d桌面模型程序,showlive2dByQt资源-CSDN文库

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023 ACDU 中国行 · 西安站 | 数据库技术发展及实践

ACDU 中国行西安站由中国数据库联盟联合浪潮数据库等单位共同主办,特邀中国计算机学会(CCF)为本次活动的指导单位。 作为中国数据库联盟的品牌活动之一,【ACDU 中国行】在线下汇集数据库领域的行业知名人士,共同探讨数…

契约锁电子签章让合同起草、审查不再难

起草、审查合同是签约过程中最繁琐的环节之一。 小到筛选合同范本、确认并填写签署方信息、计算工资、服务费用或产品价格,大到合同条款审查、修改…总之想要呈现一份合规、双方满意的合同文书常常消耗大量时间和精力,事倍功半。 销售刚刚和客户确认订单…

Excel往Word复制表格时删除空格

从Excel复制到word,复制后,前面出现了空格 原因:这个空白是缩进 方法:先将缩进转为空格,再将空格删除 第一步:选中表格,如下操作 第二步:选中表格,排版,将…

ftp传海量文件会卡?跨境数据传输推荐使用FTP吗?

企业在传输大量文件时,经常会遇到FTP卡顿的问题,尽管采取多种方式仍无法完美解决,尤其是在跨境数据传输方面。对于紧急项目而言,文件数据无法及时同步可能导致任务无法按时完成。在传输速度方面,甚至可能出现每秒几KB的…

医院HIS系统慢和卡顿网络流量分析

分析背景 近期医院的医生使用HIS系统的时候,经常出现系统慢和卡顿现象。经过交流得知医生在点击一个页面,需要等很久才能加载出来,且对于开药这种的操作,医生需要点每个大类去找到对应的药,每点一次都需要等一会儿才能…

BearPi Std 板从入门到放弃 - 先天神魂篇(1)(RT-Thread 指令点亮LED)

简介 使用 BearPi IOT Std板&#xff0c; 开发板简单信息 主芯片: STM32L431RCT6 串口: Usart1 USER LED : PC13 E53_SC1 扩展板与主板连接: I2C : I2C1 (光照强度传感器&#xff1a;BH1750) LED: PB9RT-Thread 创建线程 线程的管理方式 添加用户代码 main.c #include <…

Java爬虫攻略:应对JavaScript登录表单

问题背景 在进行网络抓取数据时&#xff0c;经常会遇到需要登录的网站&#xff0c;特别是使用JavaScript动态生成登录表单的情况。传统的爬虫工具可能无法直接处理这种情况&#xff0c;因此需要一种能够模拟用户行为登录的情况解决方案。 在实际项目中&#xff0c;我们可能需要…

uniapp-实现一级二级职位选择,完整页面!!!

一、需求 该页面实现的功能有&#xff1a; 该页面是左侧为一级&#xff0c;右侧为二级&#xff1b;可以搜索职位进行选择&#xff1b;底部显示已选的岗位&#xff0c;点击每一项会删除&#xff1b;右侧的二级岗位&#xff0c;点击时会选中&#xff0c;再次点击会取消&#xf…

AI数字人在tiktok平台开播教程!

AI数字人作为一种虚拟形象的代表&#xff0c;正在逐渐走进人们的生活。在小红书这样的短视频平台上&#xff0c;AI数字人也有机会开展直播活动&#xff0c;展示自己的个性魅力&#xff0c;也可以进行直播带货&#xff01; 数字人在淘宝购物平台开播原理 &#xff08;1&#xff…

[UNILM]论文实现:Unified Language Model Pre-training for Natural Language.........

文章目录 一、完整代码二、论文解读2.1 介绍2.2 架构2.3 输入端2.4 结果 三、过程实现四、整体总结 论文&#xff1a;Unified Language Model Pre-training for Natural Language Understanding and Generation 作者&#xff1a;Li Dong, Nan Yang, Wenhui Wang, Furu Wei, Xia…

【docker】容器使用(Nginx 示例)

查看 Docker 客户端命令选项 docker上面这三张图都是 常用命令&#xff1a; run 从映像创建并运行新容器exec 在运行的容器中执行命令ps 列出容器build 从Dockerfile构建映像pull 从注册表下载图像push 将图像上载到注册表…

深度学习 Day10——T10数据增强

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言一、我的环境二、代码实现与执行结果1.引入库2.设置GPU&#xff08;如果使用的是CPU可以忽略这步&#xff09;3.导入数据4.查…

Vue3-05-计算属性使用详解

计算属性简介 计算属性的函数是 computed()。计算属性可以帮助我们处理有复杂逻辑的响应式数据的渲染&#xff0c; 从而代替 模板表达式 的写法。比如 &#xff1a; 一个数值类型的数组对象&#xff0c;我们希望页面展示的只有 偶数。 此时&#xff0c;就可以通过 计算属性 来…

美食大赛的题解

目录 原题描述&#xff1a; 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 样例输入&#xff1a; 样例输出&#xff1a; 数据规模&#xff1a; 题目大意&#xff1a; 主要思路&#xff1a; 注&#xff1a; 代码&#xff1a; 原题描述&#xff1a…

家具制造ERP软件包含哪些功能?家具制造业ERP系统哪个好

不同的家具有不同的用料、品质、制造工时、营销渠道等&#xff0c;而有些家具制造企业采用传统的管理方式在处理物料BOM、生产实际成本核算、库存盘点、供应商选择、班组计件核对、生产领用以及物料追溯等方面存在不少提升空间。 与此同时也有很多的皮具制造企业借助ERP软件优…

Qt的坐标系系统 - 3个坐标系,2个变换

参考&#xff1a; https://zhuanlan.zhihu.com/p/584048811https://www.zhihu.com/tardis/zm/art/634951149?source_id1005 小谈Qt的坐标系系统 Qt中有三个坐标系 设备坐标系窗口坐标系逻辑坐标系 设备坐标系: 即Device坐标系。也是物理坐标系。即真实的的物理坐标系。 …

[IDEA] 写代码时没有类型推断的解决方法

本示例使用scala, 其他语言同理 使用 .var 时会自动生成变量 使用快捷键 CtrlAtlv 一样 val abc "abc"但是这个变量没有显式表现类型 期望 val abc: String "abc" 解决方法

python自动化运维快速入门,python自动化运维教程

大家好&#xff0c;给大家分享一下python自动化运维需要掌握的技能&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 面向学员 熟练使用计算机&#xff0c;对Windows、Linux 有一点了解从业职或在校学生 对目前从事互联网运维&#xff0c;想…

23种设计模式之模板方法模式(模板模式)

23种设计模式之模板方法模式(模板模式) 文章目录 23种设计模式之模板方法模式(模板模式)设计思想模板方法的优缺点模板方法模式的缺点代码解析小结 设计思想 原文:定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构…

网络基础(五):网络层协议介绍

目录 一、网络层 1、网络层的概念 2、网络层功能 3、IP数据包格式 二、ICMP协议 1、ICMP的作用和功能 2、ping命令的使用 2.1ping命令的通用格式 2.2ping命令的常用参数 2.3TypeCode&#xff1a;查看不同功能的ICMP报文 2.4ping出现问题 3、Tracert 4、冲突域 5、…
最新文章