当前位置: 首页 > 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.dtcms.com/a/319525.html

相关文章:

  • DAY33打卡
  • 【Unity输入系统】自定义与双击不冲突的单击Interaction
  • 【第八章】函数进阶宝典:参数、返回值与作用域全解析
  • RedisBloom使用
  • 任务进度状态同步 万能版 参考 工厂+策略+观察者设计模式 +锁设计 springboot+redission
  • itextPdf获取pdf文件宽高不准确
  • 设计模式-装饰模式 Java
  • 客户端利用MinIO对服务器数据进行同步
  • VN1 供应链销量预测建模竞赛技巧总结与分享(七)
  • 四边形面积
  • 极简 5 步:Ubuntu+RTX4090 源码编译 vLLM
  • JavaWeb03——基础标签及样式(表单)(黑马视频笔记)
  • 八、基于GD32 Embedded Builder开发GD32VW553(蓝牙广播)
  • 复杂光照场景漏检率↓76%!陌讯多模态融合算法在打电话识别的边缘部署优化
  • 使用Puppeteer轻松自动化浏览器操作
  • PYLON交叉编译:Ubuntu是x86,编译出arm64上运行的程序
  • 无人机航拍数据集|第8期 无人机海上目标检测YOLO数据集3641张yolov11/yolov8/yolov5可训练
  • 下载 | Windows Server 2016最新原版ISO映像!(集成7月更新、标准版、数据中心版、14393.8246)
  • 基于 C 语言的多态机制的驱动架构
  • 十八、k8s细粒度流量管理:服务网格
  • UiPath Studio介绍
  • CS231n2017 Assignment3 RNN、LSTM部分
  • 仁懋高压MOSFET在新能源汽车充电领域的应用
  • Java并发与数据库锁机制:悲观锁、乐观锁、隐式锁与显式锁
  • Java基础学习1(Java语言概述)
  • 音视频时间戳获取与同步原理详解
  • 如何为WordPress启用LiteSpeed缓存
  • --- Eureka 服务注册发现 ---
  • 安卓Handler和Looper的学习记录
  • 计算机视觉-OpenCV