Das funzt nicht. Ich habe folgendes gemacht:
Code: Alles auswählen
$ cd ./OBJFileLoader
$ 2to3 objloader.py
RefactoringTool: Refactored objloader.py
--- objloader.py (original)
+++ objloader.py (refactored)
@@ -27,7 +27,7 @@
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ix, iy, 0, GL_RGBA,
GL_UNSIGNED_BYTE, image)
else:
- mtl[values[0]] = map(float, values[1:])
+ mtl[values[0]] = list(map(float, values[1:]))
return contents
class OBJ:
@@ -44,17 +44,17 @@
values = line.split()
if not values: continue
if values[0] == 'v':
- v = map(float, values[1:4])
+ v = list(map(float, values[1:4]))
if swapyz:
v = v[0], v[2], v[1]
self.vertices.append(v)
elif values[0] == 'vn':
- v = map(float, values[1:4])
+ v = list(map(float, values[1:4]))
if swapyz:
v = v[0], v[2], v[1]
self.normals.append(v)
elif values[0] == 'vt':
- self.texcoords.append(map(float, values[1:3]))
+ self.texcoords.append(list(map(float, values[1:3])))
elif values[0] in ('usemtl', 'usemat'):
material = values[1]
elif values[0] == 'mtllib':
RefactoringTool: Files that need to be modified:
RefactoringTool: objloader.py
Aber nach wie vor bekomme ich diesen Fehler, wenn ich es mit Python3 laufen lasse:
Code: Alles auswählen
File objloader.py", line 49, in __init__
v = v[0], v[2], v[1]
TypeError: 'map' object is not subscriptable
Programm-Code:
Code: Alles auswählen
...
if values[0] == 'v':
v = map(float, values[1:4])
if swapyz:
v = v[0], v[2], v[1] # <---- hier !
self.vertices.append(v)
Mit Python2 geht es ohne Fehler.
Beim näheren Hinschauen ist mir auch aufgefallen, dass in obloader.py auch das zum obj-File gehörige mtl-File geladen wird, und zwar mit einer pygame-Funktion:
Code: Alles auswählen
surf = pygame.image.load(mtl['map_Kd'])
image = pygame.image.tostring(surf, 'RGBA', 1)
pygame habe ich dann natürlich auch versucht, per 2to3 umzuwandeln, das funktioniert aber bei den vielen packages nicht.
Hätte ich gewusst, was es für Einschränkungen bezüglich des Paket-Angebots bei Python3 gibt, hätte ich direkt alles in Python2 programmiert.
Werde mir mal OpenGLContext (Python2) anschauen. Vielleicht kann man ja dort die obj-import-Funktion extrahieren und umwandeln. Grosse Hoffnungen habe ich da aber nicht.