I have a FBX SDK Python script that correctly receives vertices and indices, that is, when receiving them, the mesh is correctly built, but it also receives UV and Normal correctly, what's the problem (textures and shadows are incorrectly applied)? Maybe because I get through the polygons?
Script:
import sys, os, json, urlparse sys.path.append( '.../public_html/engine/utils/fbx/lib/Python27_ucs4_x64/' ) from fbx import * def application( environ, start_response ): #url path value = environ[ 'HTTP_HOST' ]+environ[ 'REQUEST_URI' ] query = urlparse.urlparse(value).query.decode( 'UTF-8', 'strict' ) url = urlparse.parse_qs(query)[ 'url' ][0] path = '.../public_html/engine/'+url #initializing file manager = FbxManager.Create() IOSettings = FbxIOSettings.Create( manager, 'IOSettings' ) manager.SetIOSettings( IOSettings ) scene = FbxScene.Create( manager, 'Scene' ) importer = FbxImporter.Create( manager, 'Importer' ) status = importer.Initialize( path, -1, IOSettings ) JsonReq = [] if( status != False ): #if file exist importer.Import( scene ) importer.Destroy() pFbxRootNode = scene.GetRootNode() objcount = pFbxRootNode.GetChildCount() for i in range( objcount ): #for every object pFbxChildNode = pFbxRootNode.GetChild( i ) pMesh = pFbxChildNode.GetNodeAttribute() if( pMesh == None ): continue geometry = FbxGeometryConverter( manager ) pMesh = geometry.Triangulate( pMesh, True ) attributeType = pMesh.GetAttributeType(); if( attributeType != FbxNodeAttribute.eMesh ): continue polygonCount = pMesh.GetPolygonCount() layerCount = pMesh.GetLayerCount() indices = pMesh.GetPolygonVertices() pVertices = pMesh.GetControlPoints() m_vecIndices = indices m_vecVertices = [] m_vecNormals = [] m_vecUVs = [] m_vecUVIndices = [] UVs = [] #transform node = pMesh.GetNode() lTmpVector = node.GetGeometricTranslation( FbxNode.eSourcePivot ) Position = [ lTmpVector[ 0 ], lTmpVector[ 1 ], lTmpVector[ 2 ] ] lTmpVector = node.GetGeometricRotation( FbxNode.eSourcePivot ) Rotation = [ lTmpVector[ 0 ], lTmpVector[ 1 ], lTmpVector[ 2 ] ] lTmpVector = node.GetGeometricScaling( FbxNode.eSourcePivot ) Scale = [ lTmpVector[ 0 ], lTmpVector[ 1 ], lTmpVector[ 2 ] ] #vertices control_points_count = pMesh.GetControlPointsCount() control_points = pVertices positions = [] for z in range( control_points_count ): tmp = control_points[ z ] tmp = [ tmp[ 0 ], tmp[ 1 ], tmp[ 2 ] ] positions.append( tmp ) if node: t = node.GeometricTranslation.Get() t = FbxVector4( t[ 0 ], t[ 1 ], t[ 2 ], 1 ) r = node.GeometricRotation.Get() r = FbxVector4( r[ 0 ], r[ 1 ], r[ 2 ], 1 ) s = node.GeometricScaling.Get() s = FbxVector4( s[ 0 ], s[ 1 ], s[ 2 ], 1 ) hasGeometricTransform = False if t[ 0 ] != 0 or t[ 1 ] != 0 or t[ 2 ] != 0 or \ r[ 0 ] != 0 or r[ 1 ] != 0 or r[ 2 ] != 0 or \ s[ 0 ] != 1 or s[ 1 ] != 1 or s[ 2 ] != 1: hasGeometricTransform = True if hasGeometricTransform: geo_transform = FbxMatrix( t, r, s ) else: geo_transform = FbxMatrix() transform = None if hasGeometricTransform: transform = geo_transform if transform: for z in range( len( positions ) ): v = positions[ z ] position = FbxVector4( v[ 0 ], v[ 1 ], v[ 2 ] ) position = transform.MultNormalize( position ) positions[ z ] = [ position[ 0 ], position[ 1 ], position[ 2 ] ] for z in range( len( positions ) ): m_vecVertices.extend( positions[ z ] ) #normals for z in range( layerCount ): mesh_normals = pMesh.GetLayer( z ).GetNormals() if( not mesh_normals ): continue normals_array = mesh_normals.GetDirectArray() normals_count = normals_array.GetCount() if normals_count == 0: continue normal_values = [] for l in range( normals_count ): normal = normals_array.GetAt( l ) normal = [ normal[ 0 ], normal[ 1 ], normal[ 2 ] ] normal_values.append( normal ) node = pMesh.GetNode() if node: t = node.GeometricTranslation.Get() t = FbxVector4( t[ 0 ], t[ 1 ], t[ 2 ], 1 ) r = node.GeometricRotation.Get() r = FbxVector4( r[ 0 ], r[ 1 ], r[ 2 ], 1 ) s = node.GeometricScaling.Get() s = FbxVector4( s[ 0 ], s[ 1 ], s[ 2 ], 1 ) hasGeometricTransform = False if t[ 0 ] != 0 or t[ 1 ] != 0 or t[ 2 ] != 0 or \ r[ 0 ] != 0 or r[ 1 ] != 0 or r[ 2 ] != 0 or \ s[ 0 ] != 1 or s[ 1 ] != 1 or s[ 2 ] != 1: hasGeometricTransform = True if hasGeometricTransform: geo_transform = FbxMatrix( t, r, s ) else: geo_transform = FbxMatrix() transform = None if hasGeometricTransform: transform = geo_transform if transform: t = FbxVector4( 0, 0, 0, 1 ) transform.SetRow( 3, t ) for l in range( len( normal_values ) ): n = normal_values[ l ] normal = FbxVector4( n[ 0 ], n[ 1 ], n[ 2 ] ) normal = transform.MultNormalize( normal ) normal.Normalize() normal = [ normal[ 0 ], normal[ 1 ], normal[ 2 ] ] normal_values[ l ] = normal m_vecNormals.append( normal_values ) #UVs for z in range( layerCount ): mesh_uvs = pMesh.GetLayer( z ).GetUVs() if( not mesh_uvs ): continue uvs_array = mesh_uvs.GetDirectArray() uvs_count = uvs_array.GetCount() if( uvs_count == 0 ): continue uv_values = [] uv_indices = [] for l in range( uvs_count ): uv = uvs_array.GetAt( l ) uv = [ uv[ 0 ], uv[ 1 ] ] uv_values.append( uv ) vertexId = 0 for p in range( polygonCount ): poly_size = pMesh.GetPolygonSize( p ) poly_uvs = [] for v in range( poly_size ): control_point_index = pMesh.GetPolygonVertex( p, v ) if mesh_uvs.GetMappingMode() == FbxLayerElement.eByControlPoint: if mesh_uvs.GetReferenceMode() == FbxLayerElement.eDirect: poly_uvs.append(control_point_index) elif mesh_uvs.GetReferenceMode() == FbxLayerElement.eIndexToDirect: index = mesh_uvs.GetIndexArray().GetAt( control_point_index ) poly_uvs.append( index ) elif mesh_uvs.GetMappingMode() == FbxLayerElement.eByPolygonVertex: uv_texture_index = mesh_uvs.GetIndexArray().GetAt(vertexId) if mesh_uvs.GetReferenceMode() == FbxLayerElement.eDirect or \ mesh_uvs.GetReferenceMode() == FbxLayerElement.eIndexToDirect: poly_uvs.append( uv_texture_index ) elif mesh_uvs.GetMappingMode() == FbxLayerElement.eByPolygon or \ mesh_uvs.GetMappingMode() == FbxLayerElement.eAllSame or \ mesh_uvs.GetMappingMode() == FbxLayerElement.eNone: return '[]' vertexId += 1 uv_indices.append( poly_uvs ) UVs.extend( uv_values ) m_vecUVIndices.extend( uv_indices ) for z in range( len( m_vecUVIndices ) ): for v in range( len( m_vecUVIndices[ z ] ) ): m_vecUVs.extend( UVs[ m_vecUVIndices[ z ][ v ] ] ) #Request JsonReq.append( { 'indices': m_vecIndices, 'normals': m_vecNormals, 'UV': m_vecUVs, 'vertices': m_vecVertices, 'transform': [ Position, Rotation, Scale ] } ) JsonReq = json.dumps( JsonReq ) status = '200 OK' response_headers = [ ( 'Content-type','text/plain' ) ] start_response( status, response_headers ) return JsonReq