基于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.使用单例模式管理核心组件,如LAppDelegate
和LAppLive2DManager
// 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窗口上。
-
准备以上文件后我们用Qt Creator新建一个带界面UI文件的Qt程序,编译器使用MSVC对应的版本,名字叫Live2DDemo,然后把以上链接库,源文件,头文件添加到项目中。
-
添加完成后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"的方式包含的。如果更改了,需要去源码那里改一下头文件的包含。