Jump to content

  • Log In with Google      Sign In   
  • Create Account

[FBX SDK] Importing static model problem

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1   Members   


Posted 09 March 2014 - 04:51 PM



I am trying to import a model with the help of the fbx sdk. Now it's not the best documented SDK so please help me with this one.

The following code loads vertices,normals, uvs and indices. This gets then rendered by opengl. The rendering part works fine(already tested with static stuff). The problem is loading the normals. So here the code:

int polygonCount = pMesh->GetPolygonCount();
		int numIndices = polygonCount * 3;
		int numVertices = pMesh->GetControlPointsCount();

		FbxGeometryElementNormal *pNormalElement = pMesh->GetElementNormal(0);
		FbxGeometryElementUV *pUVElement = pMesh->GetElementUV(0);

		FbxLayerElement::EMappingMode normalMappingMode = pNormalElement->GetMappingMode();
		FbxLayerElement::EMappingMode uvMappingMode = pUVElement->GetMappingMode();

		FbxLayerElement::EReferenceMode normalReferenceMode = pNormalElement->GetReferenceMode();
		FbxLayerElement::EReferenceMode uvReferenceMode = pUVElement->GetReferenceMode();

		unsigned short *pIndices = new unsigned short[numIndices];
		for(int i = 0;i<polygonCount;i++)
			for(int j = 0;j<3;j++)
				int polygonVertex = pMesh->GetPolygonVertex(i,j);
				pIndices[(i*3)+j] = polygonVertex;
				FbxVector4 position = pMesh->GetControlPointAt(polygonVertex);
				pVertices[polygonVertex].x = position.mData[0];
				pVertices[polygonVertex].y = position.mData[1];
				pVertices[polygonVertex].z = position.mData[2];

				FbxVector4 normal = pNormalElement->GetDirectArray().GetAt(polygonVertex);
				pVertices[polygonVertex].nx = normal.mData[0];
				pVertices[polygonVertex].ny = normal.mData[1];
				pVertices[polygonVertex].nz = normal.mData[2];

				FbxVector2 uv = pUVElement->GetDirectArray().GetAt(polygonVertex);
				pVertices[polygonVertex].uvx = uv.mData[0];
				pVertices[polygonVertex].uvy = uv.mData[1];

And this code then gives me the output you can see on the attached screenshot(its supposed to be superman). The colors are just the normals used as color. Also the normals face in random directions, so most of the time I see through the mesh.


Am I using the fbx sdk correctly? I am really not sure about the index in the function call pNormalElement->GetDirectArray().GetAt(polygonVertex);


I hope someone can help me.


Thanks in advance!

Attached Thumbnails

  • superman_normals_wrong.png

#2   Members   


Posted 10 March 2014 - 01:35 AM

Have you tried to not normalize the vector here:

				FbxVector4 normal = pNormalElement->GetDirectArray().GetAt(polygonVertex);

I don't know the SDK, but the normal is only a 3-component vector, leaving the w-coord with either 0 or some other random value. Normalizing the whole 4-component vector would deform it if the w-coord contains some random value.


Although check the mapping mode. Direct mapping for normals might work, but UV is likely mapped by index. Best to take a look at the file itself.



Gnoblins: Website - Facebook - Twitter - Youtube - Steam Greenlit - IndieDB - Gamedev Log

#3   Members   


Posted 10 March 2014 - 03:33 AM

I changed the line to

FbxVector4 normal = pNormalElement->GetDirectArray().GetAt(polygonVertex);
normal.mData[3] = 0.f;

so it doesnt normalize the w-component. Doesn't change anything.


I checked the referenceMode of the normals and it is set to eDirect and as you said the uv is referenced with eDirectToIndex.

Since I am not using the uvs atm I don't want to worry about them. I first wanna get the normals right.


NormalMappingMode is eByPolygonVertex

NormalReferenceMode is eDirect


I think for these 2 values I am extracting the data the correct way, am I?

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.