void BoneBridgeCAL3D::SetModelSpaceTransform(const Matrix4x4f& modelSpaceTransform) const { // calculate the transform as relative to the parent bone Matrix4x4f localModelSpaceTransform = Matrix4x4f::Identity(); { // for now use absolute model space positioning localModelSpaceTransform = modelSpaceTransform; // divide by any existing parent's model space position if (const Bone* parent = GetParent()) { //const osg::Matrix parentTransform = ConvertKerneltoOSG(parent->GetModelSpaceTransform()); const Matrix4x4f parentTransform = parent->GetModelSpaceTransform(); // get inverse of parent transform const Matrix4x4f invParentTransform = parentTransform.Inverse(); localModelSpaceTransform *= invParentTransform; } } // now update the cal3d side from this new model space information #if WRITE_CAL3D_BONE_TRANSLATION // update model space position { Vec3f kernelPosVec = localModelSpaceTransform.GetTranslation(); CalVector calPosVec; for (int i = 0; i < 3; ++i) { calPosVec[i] = kernelPosVec[i]; } mpCalBone->setTranslation(calPosVec); // setting the relative position } #endif #if WRITE_CAL3D_BONE_ROTATION // update model space orientation { const Quaternionf& kernelRotQuat = localModelSpaceTransform.GetRotate(); CalQuaternion calRotQuat; calRotQuat = ConvertKerneltoCAL3D(kernelRotQuat); mpCalBone->setRotation(calRotQuat); // setting the relative orientation } #endif }