
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
Hello,
I am trying to import rigging datas from my own software. Once I have created all the bones and the hierarchy, I try to add weights for each vertex of my model. However, the "AddWeights" method from ISkinImportData returns false each time I try to add weights on an extreme bone.
Here is how create the bones:
// itBone is an iterator on a map <size_t, myBoneStructure>
// node is the node corresponding to my model in 3dsMax
Modifier* skin = (Modifier*)CreateInstance(SClass_ID(OSM_CLASS_ID), SKIN_CLASSID);
ISkinImportData* skinInterface = (ISkinImportData*)skin->GetInterface(I_SKINIMPORTDATA);
GetCoreInterface12()->AddModifier(*node, *skin);
std::map<size_t, INode*> bonePerId; for (auto itBone = xstObj->skinningData_.GetSkinningBoneData()->Begin(); itBone != xstObj->skinningData_.GetSkinningBoneData()->End(); ++itBone) { Object* pBone = (Object*)ip->CreateInstance(GEOMOBJECT_CLASS_ID, BONE_OBJ_CLASSID); INode* boneNode = ip->CreateObjectNode(pBone); std::string boneName = "Bone_" + boost::lexical_cast<std::string>(mySkeletonIndex); boneName += boost::lexical_cast<std::string>(itBone->first); std::wstring wideBoneName = std::wstring(boneName.begin(), boneName.end()); const wchar_t* result = wideBoneName.c_str(); const MCHAR* nodeName(result); boneNode->SetName(nodeName); bonePerId[itBone->first] = boneNode; }
Here is how I create my hierarchy:
for (auto itBone = meshObj->skinningData_.GetSkinningBoneData()->Begin(); itBone != meshObj->skinningData_.GetSkinningBoneData()->End(); ++itBone) { const size_t &parentBoneId(itBone->first); const SkinningBone &parentBone(itBone->second); INode &parentMaxNode(*bonePerId[parentBoneId]); const std::vector<size_t> &childIds = parentBone.GetChildIds(); // For each child for (auto childIt(childIds.begin()); childIt != childIds.end(); ++childIt) { // Attach it to the parent const size_t &childId(*childIt); SkinningBone & childBone = meshObj->skinningData_.GetSkinningBoneData()->GetSkinningBone(childId); INode &childMaxNode(*bonePerId[childId]); parentMaxNode.AttachChild(&childMaxNode); // Position and rotate it Point3 posDelta = childBone.GetBonePosition() - parentBone.GetBonePosition(); posDelta = msg->tsf_ * posDelta * 40; const Point3 posDeltaMax(posDelta.x, posDelta.y, posDelta.z); Matrix3 mat; mat.SetTranslate(posDeltaMax); childMaxNode.SetNodeTM(0, mat); } }
And finally here is how I add the weights :
for (auto itWeights = weightsPerBonePerVertice.begin(); itWeights != weightsPerBonePerVertice.end(); ++itWeights) { Tab<INode*> tabNodes; Tab<float> tabWeights; int count = (int)itWeights->second.size(); tabNodes.SetCount(count); tabWeights.SetCount(count); size_t index = 0; for (auto itBone = (itWeights->second).begin(); itBone != (itWeights->second).end(); ++itBone) { float weightForBone = (float)itBone->second; tabNodes[index] = bonePerId[itBone->first]; tabWeights[index] = weightForBone; index++; } bool addedWeights = skinInterface->AddWeights(node, (int)itWeights->first, tabNodes, tabWeights); }
Say my model is a tree with 5 bones, the 4th is the end of a branch and the 5th is the end of the trunk. Then, when AddWeights tries to add some weights on either of those two bones, the method returns false.
What did I do wrong ? Why does it returns false and refuses to add weights to those bones ?
Thank you !
Solved! Go to Solution.