当前位置: 首页 > news >正文

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

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

基本说明

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

DesktopLive2D

基于上面的修改,我开发了一个Live2D模型桌面程序,可以把live2D模型放在桌面上,进行互动,支持自定义加载模型,帧率设置,快速切换模型,鼠标互动。后续准备加上ChatGPT和TTS。

这是一个基于Qt和Live2D SDK的桌面应用程序,用于展示和交互Live2D模型。主要亮点包括:

1.采用MVC架构,通过LAppLive2DManager管理模型,LAppView负责渲染,LAppDelegate处理事件

2.使用单例模式管理核心组件,如LAppDelegateLAppLive2DManager

// LAppLive2DManager.cpp - 模型管理
void LAppLive2DManager::ChangeScene(Csm::csmInt32 index) {_sceneIndex = index;ReleaseAllModel();// 加载新模型LAppModel* model = new LAppModel();model->LoadAssets("path/to/model", "model.model3.json");_models.PushBack(model);
}

渲染系统

// LAppView.cpp - OpenGL渲染
void LAppView::Render() {// 设置渲染目标SwitchRenderingTarget(_renderTarget);// 清理缓冲区glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 绘制模型for (csmUint32 i = 0; i < _models.GetSize(); i++) {LAppModel* model = _models[i];model->Draw(*_viewMatrix);}
}

交互系统

// Live2DWidget.cpp - 鼠标交互
void Live2DWidget::mousePressEvent(QMouseEvent *e) {isPressed = true;float x = TransformViewX(e->x());float y = TransformViewY(e->y());LAppLive2DManager::GetInstance()->OnTap(x, y);
}

资源管理

支持多种Live2D模型格式(.moc3)
灵活的动作和表情系统

// LAppModel.cpp - 动作控制
CubismMotionQueueEntryHandle LAppModel::StartRandomMotion(const csmChar* group, csmInt32 priority,ACubismMotion::FinishedMotionCallback onFinishedMotionHandler
) {if (_modelSetting->GetMotionCount(group) == 0) return -1;csmInt32 no = rand() % _modelSetting->GetMotionCount(group);return StartMotion(group, no, priority, onFinishedMotionHandler);
}

移植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"的方式包含的。如果更改了,需要去源码那里改一下头文件的包含。

http://www.lryc.cn/news/613493.html

相关文章:

  • ora-01658 无法为表空间 users中的段创建initial区
  • RocketMQ架构解析
  • 遥感卫星领域的AI应用
  • Day03 学习git
  • LWIP网络接口管理
  • [airplay2] airplay2简略介绍
  • 二分查找算法,并分析其时间、空间复杂度
  • IIS7.5下的https无法绑定主机头,显示灰色如何处理?
  • 前后端加密传数据实现方案
  • [ java SE ] 多人聊天窗口1.0
  • 强光干扰下裂缝漏检率↓82%!陌讯轻量化模型在道路巡检的落地实践
  • redis--黑马点评--用户签到模块详解
  • JAVA,Maven继承
  • 力扣经典算法篇-46-阶乘后的零(正向步长遍历,逆向步长遍历)
  • Linux Shell为文件添加BOM并自动转换为unix格式
  • 数据分析——Pandas库
  • 什么是 TDengine IDMP?
  • 机试备考笔记 7/31
  • 学习设计模式《二十一》——装饰模式
  • 人生后半场:从广度到深度的精进之路
  • 设计模式中的行为模式
  • 多线程 future.get()的线程阻塞是什么意思?
  • tcpdump问题记录
  • 【多重BFS】Monsters
  • 【实时Linux实战系列】基于实时Linux的高频交易系统构建
  • 【C语言】深入理解编译与链接过程
  • 数据标注之数据集的类型与如何标注
  • 时间并非维度:论其作为空间变化的转换系数
  • 大模型LL04 微调prompt-Tuning方法入门(背景与发展)
  • 深度学习的视觉惯性里程计(VIO)算法优化实践