[xoreos-devel] KotOR animations
Vsevolod Kremianskii
vkremianskii at gmail.com
Sun Aug 27 13:16:07 CEST 2017
It's all here <https://github.com/xoreos/xoreos/pull/159/files> or you
could use this <https://github.com/seedhartha/xoreos/tree/kotoranim3>
branch.
b there is a float array of MDX bone data.
For every vertex there are 8 float values, four of which are bone weights,
four are bone identifiers (or -1 if no bone is used). Weights are
normalized.
P.S. Already fixed skeleton falling through the floor
2017-08-27 18:01 GMT+07:00 Bardot Jérôme <bardot.jerome at gmail.com>:
> Can you send more code ? (a paste)
>
> what is your b ?
>
>
>
> Le 27/08/2017 à 10:26, Vsevolod Kremianskii a écrit :
>
> Alright, it works. Sort off. Except for that ugly mesh deformation issue.
> I wonder if somebody could set me in the right direction from here.
>
> Here's how it's done:
>
> I load position and orientation controllers for every animation node,
> which pretty much does it for the skeleton (also heads, since they're
> attached to the headhook).
> I load bone mapping from skin mesh header and per vertex bone data from
> MDX (as described here
> <https://github.com/xoreos/xoreos-docs/blob/master/specs/kotor_mdl.html>).
> When animation gets updated I iterate through model's skinned nodes and
> for every vertex do the following:
>
> I iterate over nodes (bones) that affect the vertex and create each node's
> global transformation matrix (relative to the root node). Then I multiply
> initial vertex coordinates by the transformation matrix and multiply that
> by the bone weight. Resulting vertex coordinates are calculated as a sum of
> four transformed vertices. There are some optimizations in place so it
> isn't quite as bad as it sounds.
>
> for (uint32 i = 0; i < vertexCount; ++i) {
> v[0] = 0;
> v[1] = 0;
> v[2] = 0;
> for (uint8 j = 0; j < 4; ++j) {
> int index = static_cast<int>(b[4 + j]);
> if (index != -1) {
> float rv[3];
> transform = transArr + (index * 16);
> transform.multiply(iv, rv);
> v[0] += rv[0] * b[j];
> v[1] += rv[1] * b[j];
> v[2] += rv[2] * b[j];
> }
> }
> v += stride;
> iv += 3;
> b += 8;
> }
>
> Now, the problem is that weird stretching issue. I have no idea what could
> cause that at the moment.
>
> <http://goog_555208919>
> https://yadi.sk/i/0hnd2a0M3MMYJR
> https://yadi.sk/i/jdiTSrXZ3MMYL3
> https://yadi.sk/i/Vm3kRTVf3MMYKQ
>
>
>
> _______________________________________________
> xoreos-devel mailing listxoreos-devel at xoreos.orghttps://xoreos.org/mailman/listinfo/xoreos-devel
>
>
>
> _______________________________________________
> xoreos-devel mailing list
> xoreos-devel at xoreos.org
> https://xoreos.org/mailman/listinfo/xoreos-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://xoreos.org/pipermail/xoreos-devel/attachments/20170827/3b36f166/attachment-0001.html>
More information about the xoreos-devel
mailing list