Avoid some broken calculations for IBoneSceneNode positions.

This is based on bugreport #458 reported by viwrap who also made a nice test-case model.
Note: While solution seems to work and would even be faster, I'm not 100% sure yet if there are no downsides.
The other solution seems to regard last column in matrices - thought I don't think we ever set or use that.
And I also haven't found out yet _why_ the original solution goes wrong.
But animation system uses right-hand quaternions unlike rest of Irrlicht which is obviously a bit dangerous, will have to check the conversions some day.

git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6438 dfc29bdd-3216-0410-991c-e03cc46cb475
This commit is contained in:
cutealien 2022-10-11 22:54:44 +00:00 committed by sfan5
parent 8ffa7eafea
commit edb381bd50
1 changed files with 18 additions and 3 deletions

View File

@ -1347,9 +1347,24 @@ void CSkinnedMesh::recoverJointsFromMesh(core::array<IBoneSceneNode*> &jointChil
{
IBoneSceneNode* node=jointChildSceneNodes[i];
SJoint *joint=AllJoints[i];
node->setPosition(joint->LocalAnimatedMatrix.getTranslation());
node->setRotation(joint->LocalAnimatedMatrix.getRotationDegrees());
node->setScale(joint->LocalAnimatedMatrix.getScale());
if ( joint->UseAnimationFrom ) // Seems to work better (else solution seems to mess up sometimes) and would be faster. Any disadvantage?
{
node->setPosition(joint->Animatedposition);
core::quaternion qrot = joint->Animatedrotation;
qrot.W *= -1.f; // Animation system uses right-handed rotations? Argh...
irr::core::vector3df euler;
qrot.toEuler(euler);
euler *= core::RADTODEG;
node->setRotation(euler);
node->setScale(joint->Animatedscale);
}
else
{
node->setPosition(joint->LocalAnimatedMatrix.getTranslation());
node->setRotation(joint->LocalAnimatedMatrix.getRotationDegrees());
node->setScale(joint->LocalAnimatedMatrix.getScale());
}
node->positionHint=joint->positionHint;
node->scaleHint=joint->scaleHint;