mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-16 22:30:42 +02:00
AnimSkeleton: Added getPre and Post rotation accessors
This commit is contained in:
parent
b55856da08
commit
1bdeeeceeb
2 changed files with 24 additions and 6 deletions
|
@ -59,8 +59,14 @@ const AnimPose& AnimSkeleton::getAbsoluteDefaultPose(int jointIndex) const {
|
|||
return _absoluteDefaultPoses[jointIndex];
|
||||
}
|
||||
|
||||
const glm::quat AnimSkeleton::getPreRotation(int jointIndex) const {
|
||||
return _joints[jointIndex].preRotation;
|
||||
// get pre multiplied transform which should include FBX pre potations
|
||||
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 {
|
||||
|
@ -99,13 +105,20 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints)
|
|||
// build a chache of default poses
|
||||
_absoluteDefaultPoses.reserve(joints.size());
|
||||
_relativeDefaultPoses.reserve(joints.size());
|
||||
_relativePreRotationPoses.reserve(joints.size());
|
||||
_relativePostRotationPoses.reserve(joints.size());
|
||||
|
||||
// iterate over FBXJoints and extract the bind pose information.
|
||||
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
|
||||
glm::mat4 rotTransform = glm::mat4_cast(_joints[i].preRotation * _joints[i].rotation * _joints[i].postRotation);
|
||||
glm::mat4 relDefaultMat = glm::translate(_joints[i].translation) * _joints[i].preTransform * rotTransform * _joints[i].postTransform;
|
||||
glm::mat4 relDefaultMat = glm::translate(_joints[i].translation) * preRotationTransform * glm::mat4_cast(_joints[i].rotation) * postRotationTransform;
|
||||
AnimPose relDefaultPose(relDefaultMat);
|
||||
_relativeDefaultPoses.push_back(relDefaultPose);
|
||||
int parentIndex = getParentIndex(i);
|
||||
|
|
|
@ -42,8 +42,11 @@ public:
|
|||
const AnimPose& getAbsoluteDefaultPose(int jointIndex) const;
|
||||
const AnimPoseVec& getAbsoluteDefaultPoses() const { return _absoluteDefaultPoses; }
|
||||
|
||||
// get pre-rotation aka Maya's joint orientation.
|
||||
const glm::quat getPreRotation(int jointIndex) const;
|
||||
// get pre transform which should include FBX pre potations
|
||||
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;
|
||||
|
||||
|
@ -64,6 +67,8 @@ protected:
|
|||
AnimPoseVec _relativeBindPoses;
|
||||
AnimPoseVec _relativeDefaultPoses;
|
||||
AnimPoseVec _absoluteDefaultPoses;
|
||||
AnimPoseVec _relativePreRotationPoses;
|
||||
AnimPoseVec _relativePostRotationPoses;
|
||||
|
||||
// no copies
|
||||
AnimSkeleton(const AnimSkeleton&) = delete;
|
||||
|
|
Loading…
Reference in a new issue