gameprogcpp / code

Game Programming in C++ Code
Other
1.01k stars 354 forks source link

Blender exporter with animation #47

Closed michaeleggers closed 7 months ago

michaeleggers commented 2 years ago

Hi and happy new year! I have written a blender exporter that writes out .gpmesh, .gpskel and .gpanim(s) These are the custom file formats in the book from chapter 12 on. When loading the files in the engine (I used chapter 12) the gpmesh comes in fine, the tpose is correct but the other animations are messed up. You can still see the animation matches somewhat the one created in blender but something is wrong there. I was not able to figure out where the mistake happens. To my best knowledge the skeleton and animation files contain the local transforms of the bones using matrix_local in Blender's python API.

I included the script and the example Blend file (Blender 3.0.0) for testing in my fork: https://github.com/michaeleggers/code/tree/blender-exporter-update/Exporter/Blender

Maybe someone is interested in looking into it.

As I am relatively new to Blender, I used this tutorial to model, rig and animate and also used the texture provided by Imphenzia: https://youtu.be/yjjLD3h3yRc

michaeleggers commented 2 years ago

The exporter works now. The reason it did not work is that you manually have to calculate the bone's local transformation by hand. When doing the calculation the matrix-multiplication is done by operator @ and not *, which does a component-wise multiplication!!! Wasted some time on that as I was not familiar enough with mathutils which is the math lib used by Blender Python API. Also, the quaternions have to be inverted. I am not sure why, though. It was intuition after a lot of trial and error. To export:

Exported UV's are incorrect at the moment. About to fix that.

chalonverse commented 2 years ago

This is really cool! Well done.

michaeleggers commented 2 years ago

Thank you! I am going to fix the UVs and then going to open a PR if that's okay.

michaeleggers commented 2 years ago

Opened a PR: #48