Timeline for exporting bind and keyframe bone poses from blender to use in OpenGL
Current License: CC BY-SA 3.0
16 events
| when toggle format | what | by | license | comment | |
|---|---|---|---|---|---|
| Jun 18, 2014 at 12:40 | answer | added | user3749411 | timeline score: 1 | |
| Feb 19, 2014 at 7:13 | history | tweeted | twitter.com/#!/StackGameDev/status/436035892374155264 | ||
| May 13, 2013 at 19:18 | comment | added | Exilyth | In blender > 2.6, you can use bpy_extras.io_utils.axis_conversion (see: blender.org/documentation/blender_python_api_2_66a_release/… ) to convert to openGL space. | |
| Nov 24, 2012 at 4:50 | history | edited | SaldaVonSchwartz | CC BY-SA 3.0 | deleted 2521 characters in body |
| Nov 23, 2012 at 5:42 | comment | added | SaldaVonSchwartz | Not really cause those are inverse bind poses. They need to go the opposite order for the whole transform to take you to and back from joint space. The skinning transform for a joint j and a vertex v should be v' = C0*C1*...*CjBj^-1*Bj-1^-1...*B0^-1*v | |
| Nov 22, 2012 at 12:58 | comment | added | ccxvii | You say you're using the same matrix conventions as OpenGL (column major). In that case, bindPosePalette[i] = GLKMatrix4Multiply(aSkeleton.joints[i].inverseBindTransform, bindPosePalette[aSkeleton.joints[i].parentIndex]) looks to me to be the wrong order. It ought to be worldMatrix = parentWorldMatrix * localMatrix. | |
| Nov 21, 2012 at 2:37 | comment | added | SaldaVonSchwartz | I just took a look at your post but I don't see any insight into my situation right off the bat: A - blender vs opengl coordinate systems -> I take care of by exporting from blender with WorldTransform = Matrix().Identity(4) WorldTransform *= Matrix.Rotation(radians(-90), 4, "X") WorldTransform *= Matrix.Rotation(radians(180), 4, "Z") B - Blender vs my math library quaternion order -> I take care of by exporting this way file.write('Q {:9f} {:9f} {:9f} {:9f}\n'.format(rotationQ[1], rotationQ[2], rotationQ[3], rotationQ[0])) | |
| Nov 21, 2012 at 1:50 | comment | added | SaldaVonSchwartz | I also added 3 pictures | |
| Nov 21, 2012 at 1:50 | history | edited | SaldaVonSchwartz | CC BY-SA 3.0 | added 1643 characters in body |
| Nov 21, 2012 at 0:34 | comment | added | SaldaVonSchwartz | but the relevant part is there in the code I already posted: in the update method you can see the code which calculates time (which is hardcoded for simplicity in this example) and figures out the right keyframes between which to interpolate | |
| Nov 21, 2012 at 0:33 | comment | added | SaldaVonSchwartz | I didn't post the source of the animation cause it's not relevant to the question and will add a bunch more of code, but the high-level approach is: on startup the animation subsystem checks a db which among other things tells it which anim clips are associated with which skeleton, from this, it uses a parser to open the animation files on disk and populate the required data structures. The data structure for an animation has fps, duration, and a keyframes array. keyframes in turn are structs which hold a kyframe number plus a skeleton pose. the pose in turn has the array of SQTs | |
| Nov 20, 2012 at 14:56 | comment | added | House | Well it sounds like you're nearly there. How are you reading in the key frame animation? Can you update with images of your troubles? | |
| Nov 20, 2012 at 6:15 | history | edited | SaldaVonSchwartz | CC BY-SA 3.0 | added 21 characters in body |
| Nov 20, 2012 at 6:08 | comment | added | House | I went through something similar recently. I don't have time to read your post right now but I'll check it again in the morning. See my post for a few tips: gamedev.stackexchange.com/questions/35451/… | |
| Nov 20, 2012 at 5:55 | history | edited | SaldaVonSchwartz | CC BY-SA 3.0 | added 2033 characters in body |
| Nov 20, 2012 at 5:47 | history | asked | SaldaVonSchwartz | CC BY-SA 3.0 |