Advertisement

[FBX SDK] Importing static model problem

Started by March 09, 2014 10:51 PM
1 comment, last by Florian22222 10 years, 8 months ago

Hello!

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];
		VERTEX_POSITION_NORMAL_UV *pVertices = new VERTEX_POSITION_NORMAL_UV[numVertices];
		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);
				normal.Normalize();
				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!

Have you tried to not normalize the vector here:


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

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.

Advertisement

I changed the line to


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

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?

This topic is closed to new replies.

Advertisement