1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
#!/usr/bin/python
"""
This script takes a .mesh file from the Meshwork
and exports a .obj file containing the same trimesh.
A .mtl file is created for texture materials.
No surface normals are calculated.
"""
import sys, string, math
inputfilenames = sys.argv[1:]
print "converting..."
print inputfilenames
for inputfilename in inputfilenames:
outputfilename = inputfilename.lower().replace(".mesh",".obj")
materialfilename = inputfilename.lower().replace(".mesh",".mtl")
mtllibname = string.split(materialfilename, "/")[-1]
print inputfilename+"->"+outputfilename+" & "+materialfilename
inputfile = open(inputfilename,"r")
lines = inputfile.read().splitlines(0)
outputfile = open(outputfilename,"w")
materialfile = open(materialfilename,"w")
mode = 'SKIP'
vertex_lines_out = ['# vertices...\n']
faces_lines_out = ['# faces...\n']
n_verts = 0
n_faces = 0
n_uvs = 0
skips = 0
vertex=[]
face=[]
uv_lines_out=['# texture uvs...\n']
textures=[]
normalForVertex=[]
uvForVertex=[]
uvIndexForKey={}
uvsForTexture={}
textureForFace=[]
textureCounter = 0
for line in lines:
if (mode == 'VERTEX'):
coordinates = string.split(line, '\t') # split line by tabs
if (len(coordinates) == 4):
n_verts = n_verts + 1
vertex_lines_out.append('v %.5f %.5f %.5f\n' % (float(coordinates[1]), float(coordinates[2]), float(coordinates[3])))
vertex.append( (float(coordinates[1]), float(coordinates[2]), float(coordinates[3])) )
elif (mode == 'FACES'):
tokens = string.split(line, '\t') # split line by tabs
if (len(tokens) == 3):
n_faces = n_faces + 1
v1 = int(tokens[0])
v2 = int(tokens[1])
v3 = int(tokens[2])
d0 = (vertex[v2][0]-vertex[v1][0], vertex[v2][1]-vertex[v1][1], vertex[v2][2]-vertex[v1][2])
d1 = (vertex[v3][0]-vertex[v2][0], vertex[v3][1]-vertex[v2][1], vertex[v3][2]-vertex[v2][2])
xp = (d0[1]*d1[2]-d0[2]*d1[1], d0[2]*d1[0]-d0[0]*d1[2], d0[0]*d1[1]-d0[1]*d1[0])
det = 1.0 / math.sqrt(xp[0]*xp[0] + xp[1]*xp[1] + xp[2]*xp[2])
norm = (xp[0]*det, xp[1]*det, xp[2]*det)
face.append((v1,v2,v3))
if (interpretTexture):
textureForFace.append(textureName)
elif (mode == 'TEXTURE'):
tokens = string.split(line, '\t') # split line by tabs
if (len(tokens) == 3):
v1 = int(tokens[0])
uu = 1.0 - float(tokens[1])
vv = 1.0 - float(tokens[2])
if ((uu > 1.0)|(uu < 0.0)|(vv > 1.0)|(vv < 0.0)):
uu = 0.0
vv = 0.0
uv_key = 'vt %.5f %.5f\n' % (uu, vv)
uv_index = n_uvs
if (uvIndexForKey.has_key(uv_key)):
# existing uv coordinates
uv_index = uvIndexForKey[uv_key]
else:
# new, unique uv coordinates
uvIndexForKey[uv_key] = uv_index
uv_lines_out.append(uv_key)
n_uvs = n_uvs + 1
uvsForTexture[textureName][v1] = (uu,vv,uv_index)
elif (mode == 'SKIP'):
skips = skips + 1
if (line[:8] == 'VERTICES'):
mode = 'VERTEX'
if (line[:8] == 'MATERIAL'):
mode = 'FACES'
interpretTexture = 0
tokens = string.split(line, '\t') # split line by tabs
if (len(tokens) == 15):
name_parts = string.split(tokens[0],' ')
name_parts.append("texture%d.png" % textureCounter)
textureName = name_parts[1]
if (tokens[5] == '4'):
interpretTexture = 1
textures.append(textureName)
uvsForTexture[textureName] = n_verts * [[]]
if (line[:5] == 'EDGES'):
mode = 'SKIP'
if (line[:3] == 'UVS'):
if (interpretTexture):
mode = 'TEXTURE'
else:
mode = 'SKIP'
outputfile.write('# exported using Mesh2Obj.py (C) Giles Williams 2005\n')
outputfile.write('mtllib %s\n' % mtllibname)
outputfile.write('o exported_mesh\n')
outputfile.write('# number of vertices %d\n' % n_verts)
outputfile.write('# number of faces %d\n' % n_faces)
outputfile.write('# number of texture uvs %d\n' % n_uvs)
outputfile.writelines(vertex_lines_out)
outputfile.writelines(uv_lines_out)
# for each texture file / material we have to write out a group of faces
#
materialfile.write('# exported using Mesh2Obj.py (C) Giles Williams 2005\n')
# check that we have textures for every vertex...
okayToWriteTexture = 1
print "uvsForTexture :"
print uvsForTexture
if (len(textureForFace) != len(face)):
okayToWriteTexture = 0
outputfile.write('# groups ...\n')
group_ctr = 1
for texture in textures:
if (texture == ''):
okayToWriteTexture = 0
# if we're all clear then write out the texture uv coordinates on a 256x256 texture
if (okayToWriteTexture):
materialfile.write('newmtl material%d_auv\nNs 100.000\nd 1.00000\nillum 2\n' % group_ctr)
materialfile.write('Kd 1.00000 1.00000 1.00000\nKa 1.00000 1.00000 1.00000\nKs 1.00000 1.00000 1.00000\n')
materialfile.write('map_Kd %s\n\n' % texture)
outputfile.write('g group_%d\n' % group_ctr)
outputfile.write('usemtl material%d_auv\n' % group_ctr)
group_ctr = group_ctr + 1
outputfile.write('# uses texture \'%s\'\n' % texture)
for i in range(0, len(face)):
facet = face[i]
texture_for_face = textureForFace[i]
if (texture == texture_for_face):
uvForVertex = uvsForTexture[texture]
outputfile.write('f %d/%d/ %d/%d/ %d/%d/\n' % (facet[0] + 1, uvForVertex[facet[0]][2] + 1, facet[1] + 1, uvForVertex[facet[1]][2] + 1, facet[2] + 1, uvForVertex[facet[2]][2] + 1, ))
# endif
# next i
# endif
# next texture
outputfile.close();
materialfile.close();
print "done"
print ""
#
# end
#
|