I am trying to export the vertices, triangles, vertex normals, and UVs with blender's Python (bpy). I need code that actually works. My program is supposed to run like this:

Loop through and create a face with UVs and verteices for each index,

Loop through vertices and create a new list of vertices and uvs that are not duplicates

Loop through faces and adjust the indices for the newer vertex list


A duplicate vertex is a vertex that shares the same location and uv location as the other (I need some duplicate vertices because they do not share the same uv)

So basicly, I want to remove vertecies that have the same location and uv and create a list of faces that can go with it.

I am not sure what is wrong with my code. I could share images onces I figure out how.

my program

#import bpy
import bpy

#my house
house = bpy.context.object.data
uv_layer = house.uv_layers.active.data

triangles = []
vertices = []
uv = []

#(the house is already split into triangles)
for i0, tri in enumerate(house.polygons):
    triangles.append([])#create a list
    for loop_index in range(tri.loop_start, tri.loop_start+tri.loop_total):
        i1 = house.loops[loop_index].vertex_index#vertex index

        triangles[i0].append(i1)#add vertex index to triangle (all I want)
        vertices.append(house.vertices[i1])#add vertex
        uv.append(uv_layer[loop_index].uv)#add uv
#new arrays
newvertices = []
newuv = []

skip = []#contain indices that should be skipped

#-1 means it should not be skipped
for i in range(len(vertices)):

#loop through vertices
for i, vert0 in enumerate(vertices):
    if skip[i] == -1:
        index = len(newvertices)#amount of new vertices

        skip[i] = index#this index routs to the newest vertex
        #create new vertex and uv
        uv0 = uv[i]
        #loop through remaning vertices
        for j in range(i+1, len(vertices)):

            #create vertex2 and uv2 for testing
            vert1 = vertices[j]
            uv1 = uv[j]

            #if vertex1 is vertex2
            if vert0.co == vert1.co:
                #if both vertices have the same uv
                if uv0 == uv1:
                    #mark this index as skippable and rout it to the newest vertex
                    skip[j] = index

newtriangles = []
#re-order triangles
for i in range(len(triangles)):
    for j in range(len(triangles[i])):
vertex_str = ""
normal_str = ""
triangle_str = ""
uv_str = ""

for vertex in newvertices:
    vertex_str += "%s,%s,%s,"%vertex.co[:]
    normal_str += "%s,%s,%s,"%vertex.normal[:]
for tri in newtriangles:
    triangle_str += "%d,"%tri[0]
    triangle_str += "%d,"%tri[1]
    triangle_str += "%d,"%tri[2]
for uv in newuv:
    uv_str += "%s,%s,"%uv[:]

f = open("c:/users/.../desktop/house/triangles.txt", "w")
f = open("c:/users/.../desktop/house/vertices.txt", "w")
f = open("c:/users/.../desktop/house/normals.txt", "w")
f = open("c:/users/.../desktop/house/uv.txt", "w")

[2]: https://i.sstatic.net/xAGM0.png![enter image description here](https://i.sstatic.net/ihNKb.png)

  • $\begingroup$ You have the line triangle_str += "%d,"%tri[2] twice. One of them should use tri[1]. $\endgroup$
    – scurest
    Commented Jan 24, 2021 at 2:39
  • $\begingroup$ I dont in mine, must have been an error putting it up here $\endgroup$ Commented Jan 24, 2021 at 2:46
  • $\begingroup$ There is a problem with mapping back to the triangles, I get the correct number of faves and nods, but the faces are out of order $\endgroup$ Commented Jan 24, 2021 at 3:00
  • $\begingroup$ triangles holds the Blender vertex indices (loop.vertex_index), not indices into vertices. Try replacing triangles[i0].append(i1) with triangles[i0].append(len(vertices)) in the first loop. $\endgroup$
    – scurest
    Commented Jan 24, 2021 at 3:08
  • $\begingroup$ skip is the triangles indexes ordered, $\endgroup$ Commented Jan 24, 2021 at 3:53

1 Answer 1


I was putting skip into triangle when skip was already the triangle face re-ranged House


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .