AnimSkeleton: Added getPre and Post rotation accessors

This commit is contained in:
Anthony J. Thibault 2016-01-12 17:24:14 -08:00
parent b55856da08
commit 1bdeeeceeb
2 changed files with 24 additions and 6 deletions

View file

@ -59,8 +59,14 @@ const AnimPose& AnimSkeleton::getAbsoluteDefaultPose(int jointIndex) const {
return _absoluteDefaultPoses[jointIndex]; return _absoluteDefaultPoses[jointIndex];
} }
const glm::quat AnimSkeleton::getPreRotation(int jointIndex) const { // get pre multiplied transform which should include FBX pre potations
return _joints[jointIndex].preRotation; const AnimPose& AnimSkeleton::getPreRotationPose(int jointIndex) const {
return _relativePreRotationPoses[jointIndex];
}
// get post multiplied transform which might include FBX offset transformations
const AnimPose& AnimSkeleton::getPostRotationPose(int jointIndex) const {
return _relativePostRotationPoses[jointIndex];
} }
int AnimSkeleton::getParentIndex(int jointIndex) const { int AnimSkeleton::getParentIndex(int jointIndex) const {
@ -99,13 +105,20 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints)
// build a chache of default poses // build a chache of default poses
_absoluteDefaultPoses.reserve(joints.size()); _absoluteDefaultPoses.reserve(joints.size());
_relativeDefaultPoses.reserve(joints.size()); _relativeDefaultPoses.reserve(joints.size());
_relativePreRotationPoses.reserve(joints.size());
_relativePostRotationPoses.reserve(joints.size());
// iterate over FBXJoints and extract the bind pose information. // iterate over FBXJoints and extract the bind pose information.
for (int i = 0; i < (int)joints.size(); i++) { for (int i = 0; i < (int)joints.size(); i++) {
// build pre and post transforms
glm::mat4 preRotationTransform = _joints[i].preTransform * glm::mat4_cast(_joints[i].preRotation);
glm::mat4 postRotationTransform = glm::mat4_cast(_joints[i].postRotation) * _joints[i].postTransform;
_relativePreRotationPoses.push_back(AnimPose(preRotationTransform));
_relativePostRotationPoses.push_back(AnimPose(postRotationTransform));
// build relative and absolute default poses // build relative and absolute default poses
glm::mat4 rotTransform = glm::mat4_cast(_joints[i].preRotation * _joints[i].rotation * _joints[i].postRotation); glm::mat4 relDefaultMat = glm::translate(_joints[i].translation) * preRotationTransform * glm::mat4_cast(_joints[i].rotation) * postRotationTransform;
glm::mat4 relDefaultMat = glm::translate(_joints[i].translation) * _joints[i].preTransform * rotTransform * _joints[i].postTransform;
AnimPose relDefaultPose(relDefaultMat); AnimPose relDefaultPose(relDefaultMat);
_relativeDefaultPoses.push_back(relDefaultPose); _relativeDefaultPoses.push_back(relDefaultPose);
int parentIndex = getParentIndex(i); int parentIndex = getParentIndex(i);

View file

@ -42,8 +42,11 @@ public:
const AnimPose& getAbsoluteDefaultPose(int jointIndex) const; const AnimPose& getAbsoluteDefaultPose(int jointIndex) const;
const AnimPoseVec& getAbsoluteDefaultPoses() const { return _absoluteDefaultPoses; } const AnimPoseVec& getAbsoluteDefaultPoses() const { return _absoluteDefaultPoses; }
// get pre-rotation aka Maya's joint orientation. // get pre transform which should include FBX pre potations
const glm::quat getPreRotation(int jointIndex) const; const AnimPose& getPreRotationPose(int jointIndex) const;
// get post transform which might include FBX offset transformations
const AnimPose& getPostRotationPose(int jointIndex) const;
int getParentIndex(int jointIndex) const; int getParentIndex(int jointIndex) const;
@ -64,6 +67,8 @@ protected:
AnimPoseVec _relativeBindPoses; AnimPoseVec _relativeBindPoses;
AnimPoseVec _relativeDefaultPoses; AnimPoseVec _relativeDefaultPoses;
AnimPoseVec _absoluteDefaultPoses; AnimPoseVec _absoluteDefaultPoses;
AnimPoseVec _relativePreRotationPoses;
AnimPoseVec _relativePostRotationPoses;
// no copies // no copies
AnimSkeleton(const AnimSkeleton&) = delete; AnimSkeleton(const AnimSkeleton&) = delete;