17 auto AnimationInfo = this->inJointAnimationInfo()->constDataPtr();
18 auto skeleton = AnimationInfo->getSkeleton();
21 printf(
"Error : No Skeleton \n");
24 float inputTimeEnd = AnimationInfo->getTotalTime();
28 auto& d_hinge = topo->hingeJoints();
30 c_hinge.assign(d_hinge);
32 std::map<int, std::vector<std::vector<Real>*>> animRot;
33 std::map<int, std::vector<std::vector<Real>*>> animTime;
36 auto binding = this->varBindingConfiguration()->getValue();
39 for (
size_t i = 0; i < binding.size(); i++)
43 auto name = binding[i].JointName;
44 auto hingeId = binding[i].JointId;
46 auto boneId = skeleton->findJointIndexByName(name);
49 std::vector<std::vector<Real>*> tempV(3);
50 std::vector<std::vector<Real>*> tempT(3);
51 animRot[hingeId] = tempV;
52 animTime[hingeId] = tempT;
54 animRot[hingeId][0] = &AnimationInfo->mJoint_KeyId_R_X[boneId];
55 animTime[hingeId][0] = &AnimationInfo->mJoint_KeyId_tR_X[boneId];
57 animRot[hingeId][1] = &AnimationInfo->mJoint_KeyId_R_Y[boneId];
58 animTime[hingeId][1] = &AnimationInfo->mJoint_KeyId_tR_Y[boneId];
60 animRot[hingeId][2] = &AnimationInfo->mJoint_KeyId_R_Z[boneId];
61 animTime[hingeId][2] = &AnimationInfo->mJoint_KeyId_tR_Z[boneId];
67 move += this->inDeltaTime()->getValue() * this->varSpeed()->getValue();
73 float angleDivede = -1.0;
95 auto lerp = [](
float a,
float b,
float t) {
96 return a + t * (b - a);
100 for (
size_t i = 0; i < binding.size(); i++)
102 int hingeId = binding[i].JointId;
103 int axis = binding[i].Axis;
104 float intensity = binding[i].Intensity;
106 if (!animRot[hingeId].size())
114 std::vector<Real>& animX = *animRot[hingeId][0];
115 std::vector<Real>& animY = *animRot[hingeId][1];
116 std::vector<Real>& animZ = *animRot[hingeId][2];
118 std::vector<Real>& currentAnimation = animX;
123 currentAnimation = animX;
126 currentAnimation = animY;
129 currentAnimation = animZ;
136 if (weight[axis] == -1) {
137 angle = currentAnimation[keyFrame[axis]] *
M_PI / 180 / angleDivede;
140 angle =
lerp(currentAnimation[keyFrame[axis]], currentAnimation[keyFrame[axis] + 1], weight[axis]) *
M_PI / 180 / angleDivede * intensity;
143 c_hinge[hingeId].setRange(angle, angle + epsilonAngle);
146 d_hinge.assign(c_hinge);