Joint-relative vertex positions
On 25/10/2016 at 06:49, xxxxxxxx wrote:
Cinema 4D Version: R16
Platform: Mac OSX ;
Language(s) : C++ ;
I'm coding an exporter plug-in which exports a rigged model, and while exporting the skeleton works quite well, actually, I'm having trouble coding the "binding" of the mesh to the skeleton, aka the "skinning".
I get the gist of it; multiply the vertices in world-space by the respective joint's inverse global matrix, which works with vertices affected by a single joint, but the more joints affect the vertex, the more it gets distorted (factoring in their weights).
Of course, the process of skinning is well-documented, but it seems like I don't understand what input data is necessary and/or how to extract these from Cinema.
Now, I know this has nothing to do with the SDK itself, so my question is rather whether it's possible to extract the bound vertex coordinates Cinema uses itself.
Again, I hope this isn't too unrelated to the SDK.
Thanks in advance,
On 27/10/2016 at 08:15, xxxxxxxx wrote:
honestly, I'm no expert on this topic so right now I don't know more about this than you do. Can you explain a little bit more what exactly you are doing and what you need? Maybe can you show some code that illustrates the issue?
On 27/10/2016 at 10:21, xxxxxxxx wrote:
Thanks for your reply,
there isn't much code I can show since the SDK-related process works without problems.
Basically, what I do is take a rigged PolygonObject, export its points, polygons, the weight map and the joints into an extern program, where I try to display the rigged model. Now, it would be necessary to re-rig the model in the extern program using "vertex skinning", as described here. This is where I have trouble doing this myself.
To put it in few words: translate each point by the inverse global matrix multiplied by the weight value of each affecting joint, when animating/rendering translate the translated point by each joint's global matrix multiplied by the weight value.
With just one joint, this works flawlessly, but I can't get it to work with multiple joints.
Since I have so much trouble doing this myself, I thought that maybe it's possible to use data Cinema itself, instead calculating it myself.
What I need is the data Cinema uses to modify the rigged model from this (in rest state) :
I hope this makes my question clearer.
On 23/03/2017 at 09:29, xxxxxxxx wrote:
Sorry for the late reply. Have you had a breakthrough with your problem ?
When you say
"when animating/rendering translate the translated point by each joint's global matrix multiplied by the weight value. "
are you doing this for each joint then adding the results ? Cause I think this would definitely not produce good results. Instead you would have to multiply the weight value by a joint's displacement relative to it's original position. You will apply a certain ratio (the weight value) to the displacement. The "ratioed" displacement can be added to the original position of the point.
It's a bit hard to decode what we assume you are doing in your own software with data extracted with the sdk. A suggestion would be to try to reproduce the problem with sdk code so you could send us a code snippet. I.e. reproduce a sample of what your external program is doing using the sdk code, just try to take a sample point and apply the weight values from all joints on it, see if the final result is good.