Ответ 1
Я думаю, что может быть способ интерполировать или иным образом согласовывать/смешивать UVs, чтобы в итоге получить единственный UV на вершину, если все смежно. Но в то же время, учитывая, что никто не предложил альтернативу, я закончил дублирование вершин с их различными UV-объектами и отказался от попытки экспортировать GL_ELEMENT_ARRAY. Следующий код работает, если рендеринг с одним VBO (с использованием glDrawArrays):
def exportMesh(filepath):
# Only one mesh per scene
objList = [object for object in bpy.context.scene.objects if object.type == 'MESH']
if len(objList) == 0:
return
elif len(objList) > 1:
return
#raise exepction? dialog box?
# Process the single mesh object:
mesh = objList[0]
# File name is same as the mesh name in Blender
meshFilePath = filepath[0 : filepath.rindex('/') + 1] + mesh.name + ".mesh"
file = open(meshFilePath, 'w')
WorldTransform = Matrix().Identity(4)
WorldTransform *= Matrix.Rotation(radians(90), 4, "X")
file.write('World Transform:\n')
for rcol in WorldTransform_T.row:
file.write('{:9f} {:9f} {:9f} {:9f}\n'.format(row[0], row[1], row[2], row[3]))
file.write('\n')
# Mesh (local) transform matrix
file.write('Mesh Transform:\n')
localTransform_T = mesh.matrix_local.copy()
localTransform_T.transpose()
for row in localTransform_T.row:
file.write('{:9f} {:9f} {:9f} {:9f}\n'.format(row[0], row[1], row[2], row[3]))
file.write('\n')
vertexAttributeList = []
for triangle in mesh.data.polygons:
vertices = list(triangle.vertices)
i = 0
for vertex in vertices:
vertexAttribute = list(mesh.data.vertices[vertex].co)
if triangle.use_smooth:
vertexAttribute.extend(list(mesh.data.vertices[vertex].normal))
else:
vertexAttribute.extend(list(triangle.normal))
for uv_layer in mesh.data.uv_layers:
uvCoord = uv_layer.data[triangle.loop_indices[i]].uv
vertexAttribute.extend([uvCoord[0], 1 - uvCoord[1]])
totalVertexWeight = 0
jointWeights = [group.weight for group in mesh.data.vertices[vertex].groups]
jointIndices = [group.group for group in mesh.data.vertices[vertex].groups]
for weight in jointWeights:
totalVertexWeight += weight
vgNum = len(mesh.vertex_groups)
jointWeightsAttribute = []
jointIndicesAttribute = []
for vgIndex in range(4):
if vgIndex < len(jointIndices):
jointWeightsAttribute.append(jointWeights[vgIndex] / totalVertexWeight)
jointIndicesAttribute.append(jointIndices[vgIndex])
else:
jointWeightsAttribute.append(0)
jointIndicesAttribute.append(0)
vertexAttribute.extend(jointWeightsAttribute)
vertexAttribute.extend(jointIndicesAttribute)
vertexAttributeList.append(vertexAttribute)
i += 1
# VBO
vNum = len(vertexAttributeList)
tNum = len(mesh.data.uv_layers)
file.write('VBO Length: {:d}\n'.format(vNum))
for vertexAttribute in vertexAttributeList:
file.write('{:9f} {:9f} {:9f} {:9f} {:9f} {:9f} {:9f} {:9f} {:9f} {:9f} {:9f} {:9f} {:d} {:d} {:d} {:d}\n'.format(vertexAttribute[0],
vertexAttribute[1],
vertexAttribute[2],
vertexAttribute[3],
vertexAttribute[4],
vertexAttribute[5],
vertexAttribute[6],
vertexAttribute[7],
vertexAttribute[8],
vertexAttribute[9],
vertexAttribute[10],
vertexAttribute[11],
vertexAttribute[12],
vertexAttribute[13],
vertexAttribute[14],
vertexAttribute[15]))
file.write('\n')
# Done writing mesh file
file.close()