#include <fbxsdk.h>
#include "../Common/Common.h"
#define SAMPLE_FILENAME "StereoCamera.fbx"
void PrintMatrix(const FbxAMatrix& pMatrix);
void GetStereoCameraInfo(FbxNode* pNode);
void CreateStereoCamera(FbxScene* pScene);
static bool gVerbose = true;
int main(int argc, char** argv)
{
FbxManager* lSdkManager = NULL;
FbxScene* lScene = NULL;
bool lResult;
InitializeSdkObjects(lSdkManager, lScene);
FbxString lFilePath("");
for( int i = 1, c = argc; i < c; ++i )
{
if( FbxString(argv[i]) == "-test" ) gVerbose = false;
else if( lFilePath.IsEmpty() ) lFilePath = argv[i];
}
if( lFilePath.IsEmpty() ) lFilePath = SAMPLE_FILENAME;
FBXSDK_printf("\n\nFile: %s\n\n", lFilePath.Buffer());
lResult = LoadScene(lSdkManager, lScene, lFilePath.Buffer());
if(lResult == false)
{
FBXSDK_printf("\n\nAn error occurred while loading the scene...");
}
else
{
if(!lScene)
{
FBX_ASSERT_NOW("null scene");
}
FbxNode* lRootNode = lScene->GetRootNode();
GetStereoCameraInfo(lRootNode);
CreateStereoCamera(lScene);
}
DestroySdkObjects(lSdkManager, lResult);
return 0;
}
void GetStereoCameraInfo(FbxNode* pNode)
{
if(!pNode)
return;
if(pNode->GetNodeAttribute() && pNode->GetNodeAttribute()->GetAttributeType() == FbxNodeAttribute::eCameraStereo)
{
FbxCameraStereo* lStereoCamera = (FbxCameraStereo*)pNode->GetNodeAttribute();
FbxCamera* lLeftCamera = lStereoCamera->GetLeftCamera();
FbxString lLeftName = lLeftCamera->GetName();
FBXSDK_printf("left camera: %s\n", lLeftName.Buffer());
FbxCamera* lRightCamera = lStereoCamera->GetRightCamera();
FbxString lRightName = lRightCamera->GetName();
FBXSDK_printf("right camera: %s\n", lRightName.Buffer());
double lLeftOffsetX = lStereoCamera->ReevaluateLeftCameraFilmOffsetX();
FBXSDK_printf("reevaluated left camera film offset: %f\n", lLeftOffsetX);
double lLeftFbxOffsetX = lLeftCamera->FilmOffsetX.Get();
FBXSDK_printf("The original FBX left camera film offset: %f\n", lLeftFbxOffsetX);
double lRightOffsetX = lStereoCamera->ReevaluateRightCameraFilmOffsetX();
FBXSDK_printf("reevaluated right camera film offset: %f\n", lRightOffsetX);
double lRightFbxOffsetX = lRightCamera->FilmOffsetX.Get();
FBXSDK_printf("The original FBX right camera film offset: %f\n", lRightFbxOffsetX);
FbxAMatrix lLeft_localMatrix = lStereoCamera->GetLeftCameraLocalMatrix();
FbxAMatrix lRight_localMatrix = lStereoCamera->GetRightCameraLocalMatrix();
FbxAMatrix lLeft_globalMatrix = lStereoCamera->GetLeftCameraGlobalMatrix();
FbxAMatrix lRight_globalMatrix = lStereoCamera->GetRightCameraGlobalMatrix();
FBXSDK_printf("===local TRS of left camera===\n");
PrintMatrix(lLeft_localMatrix);
FBXSDK_printf("===global TRS of left camera===\n");
PrintMatrix(lLeft_globalMatrix);
FBXSDK_printf("===local TRS of right camera===\n");
PrintMatrix(lRight_localMatrix);
FBXSDK_printf("===global TRS of right camera===\n");
PrintMatrix(lRight_globalMatrix);
}
int i, lCount = pNode->GetChildCount();
for (i = 0; i < lCount; i++)
{
GetStereoCameraInfo(pNode->GetChild(i));
}
}
void PrintMatrix(const FbxAMatrix& pMatrix)
{
if( !gVerbose ) return;
FBXSDK_printf(" T : %f %f %f %f\n",
pMatrix.GetT()[0],
pMatrix.GetT()[1],
pMatrix.GetT()[2],
pMatrix.GetT()[3] );
FBXSDK_printf(" R : %f %f %f %f\n",
pMatrix.GetR()[0],
pMatrix.GetR()[1],
pMatrix.GetR()[2],
pMatrix.GetR()[3] );
FBXSDK_printf(" S : %f %f %f %f\n",
pMatrix.GetS()[0],
pMatrix.GetS()[1],
pMatrix.GetS()[2],
pMatrix.GetS()[3] );
}
void CreateStereoCamera(FbxScene* pScene)
{
if(!pScene)
return;
FbxNode* lMyStereoNode = FbxNode::Create(pScene,"myStereoNode");
FbxCameraStereo* lMyStereoCamera = FbxCameraStereo::Create(pScene,"myStereoCamera");
lMyStereoNode->SetNodeAttribute (lMyStereoCamera);
FbxCamera* lLeftCamera = FbxCamera::Create(pScene, "leftCamera");
FbxCamera* lRightCamera = FbxCamera::Create(pScene, "rightCamera");
lMyStereoCamera->SetLeftCamera(lLeftCamera);
lMyStereoCamera->SetRightCamera(lRightCamera);
lMyStereoCamera->ConnectProperties();
double lFocalLength_Left = lLeftCamera->FocalLength.Get();
FBXSDK_printf("FocalLength of left camera: %f\n", lFocalLength_Left);
double lFocalLength_Left_src = 0;
FbxProperty lLeftSrcLengthProperty = lLeftCamera->FocalLength.GetSrcProperty();
if(lLeftSrcLengthProperty.IsValid())
{
lFocalLength_Left_src = lLeftSrcLengthProperty.Get<FbxDouble>();
FBXSDK_printf("Initialized FocalLength of left camera source: %f\n", lFocalLength_Left_src);
lMyStereoCamera->FocalLength.Set(3.333);
lFocalLength_Left = lLeftCamera->FocalLength.Get();
FBXSDK_printf("FocalLength of left camera: %f\n", lFocalLength_Left);
lFocalLength_Left_src = lLeftSrcLengthProperty.Get<FbxDouble>();
FBXSDK_printf("FocalLength of left camera source: %f\n", lFocalLength_Left_src);
}
}