FBXSDK, используя Quaternions для установки ключей вращения?

Я пытаюсь написать приложение для сохранения файлов, используя Autodesk FBXSDK. У меня это работает нормально, используя вращения Эйлера, но мне нужно обновить его, чтобы использовать кватернионы.

Соответствующая функция:

bool CreateScene(FbxScene* pScene, double lFocalLength, int startFrame)
{
//Create Camera
FbxNode* lMyCameraNode = FbxNode::Create(pScene, "p_camera");
//connect camera node to root node
FbxNode* lRootNode = pScene->GetRootNode();
lRootNode->ConnectSrcObject(lMyCameraNode);
FbxCamera* lMyCamera = FbxCamera::Create(pScene, "Root_camera");
lMyCameraNode->SetNodeAttribute(lMyCamera);// Create an animation stack
FbxAnimStack* myAnimStack = FbxAnimStack::Create(pScene, "My stack");

// Create the base layer (this is mandatory)
FbxAnimLayer* pAnimLayer = FbxAnimLayer::Create(pScene, "Layer0");

myAnimStack->AddMember(pAnimLayer);

// Get the camera’s curve node for local translation.

FbxAnimCurveNode* myAnimCurveNodeRot = lMyCameraNode->LclRotation.GetCurveNode(pAnimLayer, true);

//create curve nodes
FbxAnimCurve* myRotXCurve = NULL;
FbxAnimCurve* myRotYCurve = NULL;
FbxAnimCurve* myRotZCurve = NULL;

FbxTime lTime;                         // For the start and stop keys.  int lKeyIndex = 0;                // Index for the keys that define the curve// Get the animation curve for local rotation of the camera.
myRotXCurve = lMyCameraNode->LclRotation.GetCurve(pAnimLayer, FBXSDK_CURVENODE_COMPONENT_X, true);
myRotYCurve = lMyCameraNode->LclRotation.GetCurve(pAnimLayer, FBXSDK_CURVENODE_COMPONENT_Y, true);
myRotZCurve = lMyCameraNode->LclRotation.GetCurve(pAnimLayer, FBXSDK_CURVENODE_COMPONENT_Z, true);//This to add keys, per frame.
float frameNumber = startFrame;

for (int i = 0; i < rec.size(); i++)
{
lTime.SetFrame(frameNumber);  //frame number

//rx
lKeyIndex = myRotXCurve->KeyAdd(lTime);
myRotXCurve->KeySet(lKeyIndex, lTime, recRotX[i], FbxAnimCurveDef::eInterpolationLinear);

//ry
lKeyIndex = myRotYCurve->KeyAdd(lTime);
myRotYCurve->KeySet(lKeyIndex, lTime, recRotY[i], FbxAnimCurveDef::eInterpolationLinear);

//rz
lKeyIndex = myRotZCurve->KeyAdd(lTime);
myRotZCurve->KeySet(lKeyIndex, lTime, recRotZ[i], FbxAnimCurveDef::eInterpolationLinear);

frameNumber += 1;

}

return true;
}

В идеале я хотел бы передать здесь кватернионные данные вместо значений Эйлера x, y, z. Это возможно с fbxsdk? или мне нужно сначала преобразовать мои кватернионные данные и продолжить передавать их в эйлеры?
Спасибо.

0

Решение

Вам всегда нужно возвращаться к углам Эйлера, поскольку вы можете получить только кривые анимации для вращения XYZ. Единственное, что вы можете контролировать — это порядок вращения.

Однако вы можете использовать FbxQuaternion для своих расчетов, а затем использовать .DecomposeSphericalXYZ (), чтобы получить углы XYZ Эйлера.

1

Другие решения

Других решений пока нет …