㈠ 基於Qt的Live2D示例(幾乎都是官方給的代碼就是啦!)
長久未更新,計劃在疫情期間整理某段遺忘代碼,卻意外發現了Live2D的趣味性。由此,我萌生了將Live2D模型投射到屏幕上的想法。Live2D在C++的桌面引擎中支持DirectX、OpenGL、Cocos2d-x,我選擇使用OpenGL的Cubism SDK。由於Qt也支持OpenGL,我利用Qt資源簡化了開發過程。首先下載Cubism SDK並編譯Demo,遇到錯誤後修改CMakeLists.txt以兼容最新版本的msvc編譯器,同時加入glew和glfw,項目順利編譯。接下來分析代碼文件,移除無用部分並用Qt的QOpenGLWidget替代LAppView。為了兼容OpenGL函數,修改Framework,使QOpenGLWidget支持glClearDepthf。調整窗口屬性以實現「透明」效果,包括設置窗口屬性和響應WM_MOUSEACTIVATE消息。盡管窗口看起來透明,但模型仍然遮擋屏幕,這與項目中遇到的類似問題相關。嘗試使用WS_EX_LAYERED解決,但失敗後我採用了一種新的方法:通過LAppModel的HitTest介面判斷滑鼠是否在模型上,進而動態調整窗口屬性實現透明。處理坐標變換以確保模型正確顯示。通過LAppModel和LAppDelegate整合LAppLive2DManager類,移除模型切換代碼,實現模型固定位置顯示。利用矩陣調整模型位置,允許通過滑鼠拖動模型。實現了一個可拖動的模型,並在接下來探討Windows Toast Notification的集成。對於UWP應用相對簡單,但Win32程序涉及COM介面的復雜性。通過定義AppUserModelID和CLSID,復制組件,實現Toast Notification的生成。Toast可以區分用戶點擊的具體消息,並在程序初始化時進行配置。檢測Toast激活參數後,避免載入圖形界面,僅在Toast激活時執行函數。最後,解決了插件系統相關的線程問題、數據拉取的cookies存儲、libzip的文件管理等復雜性,確保了程序的正常運行。此外,還實現了一些有趣的功能,如音樂播放、查詢未提交作業、文件壓縮等插件。整個項目涉及多種技術挑戰,最終完成了從代碼到功能的完整實現。分享鏈接,將release版本發布。