有關mmd播放器,網上也有許多非常漂亮的實現,如 pmxeditor、saba、blender_mmd_tools等等。。 首先我想先介紹下我參考實現的倉庫: sselecirPyM/Coocoo3D: Experimental MMD renderer using DX12 and DXR. (g ...
有關mmd播放器,網上也有許多非常漂亮的實現,如 pmxeditor、saba、blender_mmd_tools等等。。
首先我想先介紹下我參考實現的倉庫:
sselecirPyM/Coocoo3D: Experimental MMD renderer using DX12 and DXR. (github.com),這是sselecirPyM大神使用NET 6.0和DX12實現的mmd渲染器,支持自定義渲染管線、光照等,感興趣的小伙伴可以在b站找他的視頻,搜名字就好。
benikabocha/saba: OpenGL Viewer (OBJ PMD PMX) (github.com),這是國外一名大神使用c++做的mmd渲染器,支持卡通光照,我的代碼基本上參考該倉庫。
接下來我介紹下渲染的實現流程,方便大家熟悉代碼。
mmd模型存在多種文件格式:
pmx、pmd屬於模型文件,裡面包含模型的最基本信息,頂點、Mesh、骨骼、材質等等。。
vmd屬於動畫文件,包含每一幀動畫要做的處理,但vmd不能單獨使用,他必須有一個模型作為載體。
代碼流程:
1. 解析模型、動畫文件。(PmxParsing、VmdParsing).cs
2. 管理該模型數據。(MMDModel、PmxModel).cs
3. 管理動畫數據。(VmdAnimation、VmdAnimationController).cs
4. 管理模型的物理信息。(MMDRigidBody、MMDJoint、MMDPhysics、MMDPhysicsManager).cs
5. 使用動畫類對模型進行控制 VmdAnimation->MMDModel。
6. 進行物理模擬 MMDPhysicsManager->MMDModel。
7. 更新頂點數據並渲染 MMDModel->Update->Draw。
具體有關gles的渲染流程就不介紹了,非常簡單。
1. 遍歷所有的meshes進行模型繪製,綁定紋理、shader參數等等。。
2. mmd模型存在描邊,所以接下來我們再根據meshes繪製一遍(註意切換shader)
3. 根據光照方向創建陰影矩陣,併在meshes里與模型矩陣相乘併進行繪製。
效果圖:
倉庫地址:qian-o/SabaSharp (github.com)