diff --git a/src/obj/NiSkinData.cpp b/src/obj/NiSkinData.cpp index 3d338f4f20ea8e824f3f619e0a95eb1fca0bbc51..8bbdd96203f7b8fa93c091e1a2caf21a35cdb8d5 100644 --- a/src/obj/NiSkinData.cpp +++ b/src/obj/NiSkinData.cpp @@ -95,7 +95,7 @@ NiSkinData::NiSkinData( const Ref<NiTriBasedGeom> & owner ) NI_SKIN_DATA_CONSTRU Matrix44 sr_world = skinInst->GetSkeletonRoot()->GetWorldTransform(); //Inverse owner NiTriBasedGeom matrix & multiply with skeleton root matrix - Matrix44 overall_mat = owner_mat.Inverse() * sr_world; + Matrix44 overall_mat = (owner_mat * sr_world.Inverse()).Inverse(); //Store result overall_mat.Decompose( translation, rotation, scale ); diff --git a/src/obj/NiTriBasedGeom.cpp b/src/obj/NiTriBasedGeom.cpp index 87420c2e2f356110eec9f1ceb66b64e4e5fba6ce..77a90a2a10aa10aecfabd05946cccf2fd692f46c 100644 --- a/src/obj/NiTriBasedGeom.cpp +++ b/src/obj/NiTriBasedGeom.cpp @@ -254,13 +254,17 @@ vector<Vector3> NiTriBasedGeom::GetSkinInfluencedVertices() const { vector<Vector3> skin_verts( vertices.size()); //Transform vertices into position based on skin data - Matrix44 root_world = skel_root->GetWorldTransform(); + Matrix44 skel_root_inv = skel_root->GetWorldTransform().Inverse(); Matrix44 geom_world = GetWorldTransform(); + Matrix44 overall_offset = skin_data->GetOverallTransform(); + for ( uint i = 0; i < skin_data->GetBoneCount(); ++i ) { Matrix44 bone_world = bone_nodes[i]->GetWorldTransform(); Matrix44 bone_offset = skin_data->GetBoneTransform(i); vector<SkinWeight> weights = skin_data->GetBoneWeights(i); - Matrix44 vert_trans = bone_offset * bone_world; + //Matrix44 vert_trans = bone_offset * skel_root_inv * bone_world * overall_offset * geom_world; + Matrix44 vert_trans = geom_world * bone_world * skel_root_inv * overall_offset * bone_offset; + for ( uint j = 0; j < weights.size(); ++j ) { uint index = weights[j].index; float weight = weights[j].weight;