diff options
author | cutealien <cutealien@dfc29bdd-3216-0410-991c-e03cc46cb475> | 2022-10-11 22:54:44 +0000 |
---|---|---|
committer | sfan5 <sfan5@live.de> | 2023-03-24 17:09:11 +0100 |
commit | edb381bd5050712d1eb8875fe3a405000dd09a3d (patch) | |
tree | d2b7b933f9e075903a2e59d642cf9dd84ae4a2a4 | |
parent | 8ffa7eafea218d12db29be08240ea233259372a1 (diff) | |
download | irrlicht-edb381bd5050712d1eb8875fe3a405000dd09a3d.tar.xz |
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
-rw-r--r-- | source/Irrlicht/CSkinnedMesh.cpp | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/source/Irrlicht/CSkinnedMesh.cpp b/source/Irrlicht/CSkinnedMesh.cpp index 75e2ca6..07e86d6 100644 --- a/source/Irrlicht/CSkinnedMesh.cpp +++ b/source/Irrlicht/CSkinnedMesh.cpp @@ -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;
|