Changed how we get skeletons. Made so that we could get the bind pose for each skeleton in the scene

This commit is contained in:
Teejoon
2015-12-18 10:03:00 +01:00
parent 67017fcaf4
commit bc4cc5db54
4 changed files with 135 additions and 32 deletions
@@ -33,6 +33,9 @@
#include <maya/MPlug.h>
#include <maya/MAnimControl.h>
#include <maya/MTime.h>
#include <maya/MDataHandle.h>
#include <maya/MTransformationMatrix.h>
#include <maya/MFnMatrixData.h>
// Wrappers
+28 -9
View File
@@ -190,25 +190,44 @@ void Menu::GetSkeletonData()
MTime startFrame = MAnimControl::animationStartTime();
MTime endFrame = MAnimControl::animationEndTime();
std::vector<std::vector<SkeletonNode>*> AllSkeletons;
std::vector<std::vector<SkeletonNode>> allSkeletons;
std::vector<BindPoseSkeletonNode> allBindPoses;
allBindPoses = m_SkeletonHandler->GetBindPoses();
for (int i = startFrame.value(); i < endFrame.value();i++)
{
MAnimControl::setCurrentTime(MTime(i, MTime::kNTSCField));
// Traverse scene and return vector with all materials
AllSkeletons.push_back(m_SkeletonHandler->DoIt());
allSkeletons.push_back(m_SkeletonHandler->DoIt());
}
//print out all bind poses
for (auto aBindPose : allBindPoses)
{
MGlobal::displayInfo(MString() + "BindPose Skeleton name: " + aBindPose.Name.c_str());
for (int i = 0; i < aBindPose.Joints.size(); i++)
{
//MGlobal::displayInfo(MString() + aBindPose.JointNames[i].c_str());
//MGlobal::displayInfo(MString() + aBindPose.ParentIDs[i]);
//MGlobal::displayInfo(MString() + aBindPose.Joints[i].Translation[0] + " " + aBindPose.Joints[i].Translation[1] + " " + aBindPose.Joints[i].Translation[2]);
//MGlobal::displayInfo(MString() + aBindPose.Joints[i].Rotation[0] + " " + aBindPose.Joints[i].Rotation[1] + " " + aBindPose.Joints[i].Rotation[2]);
//MGlobal::displayInfo(MString() + aBindPose.Joints[i].Scale[0] + " " + aBindPose.Joints[i].Scale[1] + " " + aBindPose.Joints[i].Scale[2]);
}
}
MGlobal::displayInfo(MString() + AllSkeletons.size());
for (int i = 0; i < AllSkeletons.size(); i++)
//Print out all skeletons for all frames
MGlobal::displayInfo(MString() + allSkeletons.size());
for (auto frameSkeletons : allSkeletons)
{
std::vector<SkeletonNode>*& thisSkeleton = AllSkeletons.at(i);
for (int k = 0; k < thisSkeleton->size(); k++)
for (auto aSkeleton : frameSkeletons)
{
for (int j = 0; j < thisSkeleton->at(k).Joints.size(); j++)
MGlobal::displayInfo(MString() + aSkeleton.Name.c_str());
for (auto joint : aSkeleton.Joints)
{
MGlobal::displayInfo(MString() + thisSkeleton->at(k).Joints.at(j).Name.c_str());
//MGlobal::displayInfo(MString() + joint.Translation[0] + " " + joint.Translation[1] + " " + joint.Translation[2]);
//MGlobal::displayInfo(MString() + joint.Rotation[0] + " " + joint.Rotation[1] + " " + joint.Rotation[2]);
//MGlobal::displayInfo(MString() + joint.Scale[0] + " " + joint.Scale[1] + " " + joint.Scale[2]);
}
}
}
+96 -18
View File
@@ -1,13 +1,14 @@
#include "Skeleton.h"
std::vector<SkeletonNode>* Skeleton::DoIt()
std::vector<SkeletonNode> Skeleton::DoIt()
{
MItDependencyNodes jointIt(MFn::kJoint);
std::vector<SkeletonNode> m_AllSkeletons;
MItDag jointIt(MItDag::TraversalType::kDepthFirst, MFn::kJoint);
SkeletonNode SkeletonStorage;
while (!jointIt.isDone()) {
MFnDependencyNode SkeletonFnDN(jointIt.thisNode());
MFnTransform TransformNode(SkeletonFnDN.object());
MFnTransform TransformNode(jointIt.currentItem());
Joint NewJoint;
if (MFnDependencyNode(TransformNode.parent(0)).name() == "world") {
@@ -20,24 +21,27 @@ std::vector<SkeletonNode>* Skeleton::DoIt()
SkeletonStorage.Name = TransformNode.name().asChar();
NewJoint.ParentIndex = -1; // This joint is root
}
else {
auto it = std::find(m_Hierarchy.begin(), m_Hierarchy.end(), TransformNode.parent(0));
if (it != m_Hierarchy.end()) {
NewJoint.ParentIndex = it - m_Hierarchy.begin();
}
else {
MGlobal::displayError(MString() + "Could not find joint parent for: " + TransformNode.name());
}
//NewJoint.ParentIndex = -1; // This joint is root
}
m_Hierarchy.push_back(TransformNode.object());
NewJoint.Name = TransformNode.name().asChar();
//NewJoint.Name = TransformNode.name().asChar();
MMatrix Matrix = TransformNode.transformationMatrix();
//double tmp[3];
//((MTransformationMatrix)Matrix).eulerRotation().asVector().get(tmp);
//NewJoint.Rotation[0] = tmp[0];
//NewJoint.Rotation[1] = tmp[1];
//NewJoint.Rotation[2] = tmp[2];
//((MTransformationMatrix)Matrix).getScale(tmp, MSpace::Space::kTransform);
//NewJoint.Scale[0] = tmp[0];
//NewJoint.Scale[1] = tmp[1];
//NewJoint.Scale[2] = tmp[2];
//((MTransformationMatrix)Matrix).getTranslation(MSpace::Space::kTransform).get(tmp);
//NewJoint.Translation[0] = tmp[0];
//NewJoint.Translation[1] = tmp[1];
//NewJoint.Translation[2] = tmp[2];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
NewJoint.OffsetMatrix[i][j] = Matrix.matrix[i][j];
@@ -51,5 +55,79 @@ std::vector<SkeletonNode>* Skeleton::DoIt()
m_AllSkeletons.push_back(SkeletonStorage);
return &m_AllSkeletons;
return m_AllSkeletons;
}
std::vector<BindPoseSkeletonNode> Skeleton::GetBindPoses()
{
std::vector<BindPoseSkeletonNode> m_AllSkeletons;
std::vector<MObject> m_Hierarchy;
MItDag jointIt(MItDag::TraversalType::kDepthFirst, MFn::kJoint);
BindPoseSkeletonNode SkeletonStorage;
while (!jointIt.isDone()) {
MFnTransform MayaJoint(jointIt.currentItem());
if (MFnDependencyNode(MayaJoint.parent(0)).name() == "world") {
if (SkeletonStorage.Joints.size() != 0) {
m_AllSkeletons.push_back(SkeletonStorage);
SkeletonStorage.Joints.clear();
SkeletonStorage.Name.clear();
SkeletonStorage.ParentIDs.clear();
SkeletonStorage.Name.clear();
}
SkeletonStorage.Name = MayaJoint.name().asChar();
SkeletonStorage.ParentIDs.push_back(-1); // This joint is root
}
else {
auto it = std::find(m_Hierarchy.begin(), m_Hierarchy.end(), MayaJoint.parent(0));
if (it != m_Hierarchy.end()) {
SkeletonStorage.ParentIDs.push_back(it - m_Hierarchy.begin());
}
else {
MGlobal::displayError(MString() + "Could not find joint parent for: " + MayaJoint.name());
}
}
m_Hierarchy.push_back(MayaJoint.object());
Joint NewJoint;
MPlug BindPose = MayaJoint.findPlug("bindPose");
MDataHandle DataHandle;
BindPose.getValue(DataHandle);
MFnMatrixData MartixFn(DataHandle.data());
MMatrix Matrix = MartixFn.matrix();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
NewJoint.OffsetMatrix[i][j] = Matrix.matrix[i][j];
}
}
/*double tmp[3];
((MTransformationMatrix)Matrix).eulerRotation().asVector().get(tmp);
NewJoint.Rotation[0] = tmp[0];
NewJoint.Rotation[1] = tmp[1];
NewJoint.Rotation[2] = tmp[2];
((MTransformationMatrix)Matrix).getScale(tmp, MSpace::Space::kTransform);
NewJoint.Scale[0] = tmp[0];
NewJoint.Scale[1] = tmp[1];
NewJoint.Scale[2] = tmp[2];
((MTransformationMatrix)Matrix).getTranslation(MSpace::Space::kTransform).get(tmp);
NewJoint.Translation[0] = tmp[0];
NewJoint.Translation[1] = tmp[1];
NewJoint.Translation[2] = tmp[2];*/
SkeletonStorage.Joints.push_back(NewJoint);
SkeletonStorage.JointNames.push_back(MayaJoint.name().asChar());
jointIt.next();
}
m_AllSkeletons.push_back(SkeletonStorage);
return m_AllSkeletons;
}
+8 -5
View File
@@ -7,12 +7,11 @@
#include "MayaIncludes.h"
struct Joint {
int ParentIndex;
//int ParentIndex;
//std::array<float, 3> Rotation;
//std::array<float, 3> Translation;
//std::array<float, 3> Scale;
std::array<std::array<float, 4>, 4> OffsetMatrix;
std::string Name;
};
struct SkeletonNode {
@@ -20,12 +19,16 @@ struct SkeletonNode {
std::vector<Joint> Joints;
};
struct BindPoseSkeletonNode : SkeletonNode {
std::vector<int> ParentIDs;
std::vector<std::string> JointNames;
};
class Skeleton {
public:
std::vector<SkeletonNode>* DoIt();
std::vector<SkeletonNode> DoIt();
std::vector<BindPoseSkeletonNode> GetBindPoses();
private:
std::vector<SkeletonNode> m_AllSkeletons;
std::vector<MObject> m_Hierarchy;
};
#endif //Skeleton_Skeleton_h__