void CAnimation::update() { const bool isRunning = SceneManager::instance().isRunning(); if(!isRunning && !mPreviewMode) { // Make sure attached CBone components match the position of the skeleton bones even when the component is not // otherwise running. HRenderable animatedRenderable = SO()->getComponent<CRenderable>(); if(animatedRenderable) { HMesh mesh = animatedRenderable->getMesh(); if(mesh.isLoaded()) { const SPtr<Skeleton>& skeleton = mesh->getSkeleton(); if(skeleton) { for (auto& entry : mMappingInfos) { if(!entry.isMappedToBone) continue; const UINT32 numBones = skeleton->getNumBones(); for (UINT32 j = 0; j < numBones; j++) { if (skeleton->getBoneInfo(j).name == entry.bone->getBoneName()) { Matrix4 bindPose = skeleton->getInvBindPose(j).inverseAffine(); bindPose = SO()->getTransform().getMatrix() * bindPose; Vector3 position, scale; Quaternion rotation; bindPose.decomposition(position, rotation, scale); entry.sceneObject->setWorldPosition(position); entry.sceneObject->setWorldRotation(rotation); entry.sceneObject->setWorldScale(scale); break; } } } } } } } if (mInternal == nullptr || !isRunning) return; HAnimationClip newPrimaryClip = mInternal->getClip(0); if (newPrimaryClip != mPrimaryPlayingClip) _refreshClipMappings(); if (_scriptUpdateFloatProperties) _scriptUpdateFloatProperties(); }
//----------------------------------------------------------------------- void DualQuaternion::fromTransformationMatrix (const Matrix4& kTrans) { Vector3 pos; Vector3 scale; Quaternion rot; kTrans.decomposition(pos, scale, rot); fromRotationTranslation(rot, pos); }
void DualQuaternionTests::testMatrix() { Matrix4 transform; Vector3 translation(10, 4, 0); Vector3 scale = Vector3::UNIT_SCALE; Quaternion rotation; rotation.FromAngleAxis(Radian(Math::PI), Vector3::UNIT_Z); transform.makeTransform(translation, scale, rotation); DualQuaternion dQuat; dQuat.fromTransformationMatrix(transform); Matrix4 transformResult; dQuat.toTransformationMatrix(transformResult); Vector3 translationResult; Vector3 scaleResult; Quaternion rotationResult; transformResult.decomposition(translationResult, scaleResult, rotationResult); CPPUNIT_ASSERT(translationResult.positionEquals(translation)); CPPUNIT_ASSERT(scaleResult.positionEquals(scale)); CPPUNIT_ASSERT(rotationResult.equals(rotation, Radian(0.001))); }