Friday, October 18, 2013

Fixing RenderMonkey Installer Fatal Error

Here is a workaround if your installation of RenderMonkey fails with "Fatal Error: Installation ended prematurely":
Open a command prompt, go to the directory where the RenderMonkey .msi file is located and type:

msiexec /qr /i RenderMonkey.2008-12-17-v1.82.322.msi

Thursday, October 10, 2013

FBX SDK Tips

Here are some little tips based on my current experience with the FBX SDK (2014.1):

Linker problems

If you get linker errors (e.g. related to ClassId when using the GetSrcObject or FindMember functions) make sure you link to "libfbxsdk-md.lib" instead of "libfbxsdk.lib".

Node Transformations

Regarding computation of node transformation matrices you need to realize that there are two different formulas used depending on whether the current file is a Maya scene or comes from 3dsmax.
Make sure you read the relevant section in the FBX SDK Programmer's Guide -> Nodes and the Scene Graph -> FBX Nodes -> "Computing Transformation Matrices" (http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/).


The first step is to get the local node transformation. There are several ways to do this:

Option 1:
FbxMatrix matTransform = pNode->GetScene()->GetEvaluator()->GetNodeLocalTransform(pNode);

Option 2:
FbxVector4 translation = pNode->EvaluateLocalTranslation();
FbxVector4 rotation = pNode->EvaluateLocalRotation();
FbxVector4 scale = pNode->EvaluateLocalScaling();
 
FbxMatrix matTransform( translation, rotation, scale );
   
Option 3:
FbxVector4 translation = pNode->LclTranslation.Get();
FbxVector4 rotation    = pNode->LclRotation.Get();
FbxVector4 scale       = pNode->LclScaling.Get();   
FbxMatrix matTransform( translation, rotation, scale );


The next step is to get the geometric transform (assuming 3dsmax is used):

FbxVector4 T = pNode->GetGeometricTranslation (FbxNode::eSourcePivot);
FbxVector4 R = pNode->GetGeometricRotation(FbxNode::eSourcePivot);
FbxVector4 S = pNode->GetGeometricScaling(FbxNode::eSourcePivot);
FbxMatrix matGeometricOffset(T, R, S);


Then we apply the mentioned formula for 3dsmax:

FbxMatrix nodeMatrix = parentMatrix * matTransform;
FbxMatrix worldMatrix = nodeMatrix * matGeometricOffset;


The resulting matrix should then be converted to the conventions of the 3D API you are using (GL/D3D/etc.)

Getting all AnimStacks of the current Scene

The FBX SDK in many cases provides several different ways to retrieve the same information, which can be a bit confusing at times.
To iterate over all AnimStacks in the scene you can use

    for(int i=0; i < m_pImporter->GetAnimStackCount(); i++)
    {

        FbxAnimStack* pAnimStack =  m_pScene->GetSrcObject(i);
        // ...
    }

Or alternatively:

    for(int i=0; i < m_pImporter->GetAnimStackCount(); i++)
    {
        FbxTakeInfo* takeInfo = m_pImporter->GetTakeInfo(i);
        FbxString takeName = takeInfo->mName;


        FbxAnimStack* pAnimStack = m_pScene->FindMember((const char*)takeName);
        // ...
    }

But as said, there are even more ways of doing the same thing...