Example #1
0
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();
		}
	}
}