[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