void WccToFbxExporter::addPositionKeyToNode(FbxNode *pNode, FbxAnimLayer *pAnimLayer, int timeMs, const QVector3D &position) { FbxAnimCurve* lCurve = nullptr; FbxTime lTime; int lKeyIndex = 0; lCurve = pNode->LclTranslation.GetCurve(pAnimLayer, FBXSDK_CURVENODE_COMPONENT_X, true); if (lCurve) { lCurve->KeyModifyBegin(); lTime.SetMilliSeconds(timeMs); lKeyIndex = lCurve->KeyAdd(lTime); lCurve->KeySet(lKeyIndex, lTime, position.x(), FbxAnimCurveDef::eInterpolationCubic); lCurve->KeyModifyEnd(); } lCurve = pNode->LclTranslation.GetCurve(pAnimLayer, FBXSDK_CURVENODE_COMPONENT_Y, true); if (lCurve) { lCurve->KeyModifyBegin(); lTime.SetMilliSeconds(timeMs); lKeyIndex = lCurve->KeyAdd(lTime); lCurve->KeySet(lKeyIndex, lTime, position.y(), FbxAnimCurveDef::eInterpolationCubic); lCurve->KeyModifyEnd(); } lCurve = pNode->LclTranslation.GetCurve(pAnimLayer, FBXSDK_CURVENODE_COMPONENT_Z, true); if (lCurve) { lCurve->KeyModifyBegin(); lTime.SetMilliSeconds(timeMs); lKeyIndex = lCurve->KeyAdd(lTime); lCurve->KeySet(lKeyIndex, lTime, position.z(), FbxAnimCurveDef::eInterpolationCubic); lCurve->KeyModifyEnd(); } }
void ExportCurve(FbxAnimLayer* lAnimLayer, FbxNode* pNode, const Value& animCurve, uint32_t begin, uint32_t end) { int rx = -1, ry = -1, rz = -1, rw = -1; for (uint32_t i = begin; i < end; i++) { FbxAnimCurve* fbxCurve = NULL; const Value& curve = animCurve[i]; if (strcmp(curve["propertyName"].GetString(), "m_LocalPosition.x") == 0) { fbxCurve = pNode->LclTranslation.GetCurve(lAnimLayer, FBXSDK_CURVENODE_COMPONENT_X, true); } else if (strcmp(curve["propertyName"].GetString(), "m_LocalPosition.y") == 0) { fbxCurve = pNode->LclTranslation.GetCurve(lAnimLayer, FBXSDK_CURVENODE_COMPONENT_Y, true); } else if (strcmp(curve["propertyName"].GetString(), "m_LocalPosition.z") == 0) { fbxCurve = pNode->LclTranslation.GetCurve(lAnimLayer, FBXSDK_CURVENODE_COMPONENT_Z, true); } else if (strcmp(curve["propertyName"].GetString(), "m_LocalRotation.x") == 0) { rx = i; } else if (strcmp(curve["propertyName"].GetString(), "m_LocalRotation.y") == 0) { ry = i; } else if (strcmp(curve["propertyName"].GetString(), "m_LocalRotation.z") == 0) { rz = i; } else if (strcmp(curve["propertyName"].GetString(), "m_LocalRotation.w") == 0) { rw = i; } if (fbxCurve != NULL) { fbxCurve->KeyModifyBegin(); FbxTime lTime; const Value& time = curve["time"]; const Value& value = curve["value"]; for (uint32_t i = 0; i < time.Size(); i++) { double timeValue = time[i].GetDouble(); double v = value[i].GetDouble(); lTime.SetSecondDouble(timeValue); int lKeyIndex = fbxCurve->KeyAdd(lTime); fbxCurve->KeySetValue(lKeyIndex, v); fbxCurve->KeySetInterpolation(lKeyIndex, FbxAnimCurveDef::eInterpolationCubic); } fbxCurve->KeyModifyEnd(); } } // rotation animation will be convert from quaternion to euler angle if (rx != -1) { FbxAnimCurve* fbxCurve[3]; fbxCurve[0] = pNode->LclRotation.GetCurve(lAnimLayer, FBXSDK_CURVENODE_COMPONENT_X, true); fbxCurve[1] = pNode->LclRotation.GetCurve(lAnimLayer, FBXSDK_CURVENODE_COMPONENT_Y, true); fbxCurve[2] = pNode->LclRotation.GetCurve(lAnimLayer, FBXSDK_CURVENODE_COMPONENT_Z, true); for (int i = 0; i < 3; i++) { fbxCurve[i]->KeyModifyBegin(); } FbxTime lTime; const Value& time = animCurve[rx]["time"]; for (uint32_t i = 0; i < time.Size(); i++) { double timeValue = time[i].GetDouble(); double x = animCurve[rx]["value"][i].GetDouble(); double y = animCurve[ry]["value"][i].GetDouble(); double z = animCurve[rz]["value"][i].GetDouble(); double w = animCurve[rw]["value"][i].GetDouble(); FbxQuaternion qRot(x, y, z, w); FbxVector4 euler = qRot.DecomposeSphericalXYZ(); for (int j = 0; j < 3; j++) { lTime.SetSecondDouble(timeValue); int lKeyIndex = fbxCurve[j]->KeyAdd(lTime); fbxCurve[j]->KeySetValue(lKeyIndex, euler[j]); fbxCurve[j]->KeySetInterpolation(lKeyIndex, FbxAnimCurveDef::eInterpolationCubic); } } for (int i = 0; i < 3; i++) { fbxCurve[i]->KeyModifyEnd(); } } }