2017-12-05 4 views
0

OBJFILELOADER.py 파일의 링크 (https://www.pygame.org/wiki/OBJFileLoader)에 오류가 있습니다. 나는 그러나 나는 인상 ValueError를 일을 변경 시도 OBJ 등 OBJ = (파일 이름)을 사용OBJFileLoader 오류

을하지만 여전히 오류가 많이있다, python3 버전 오류로 python2가 있다고 생각.

블렌더에서 .obj 파일을 가져 왔는데, 그게 문제라고 생각하지 않습니다.

Traceback (most recent call last): 
    File "/home/warted/anaconda3/lib/python3.6/site-packages/OpenGL/latebind.py", line 41, in __call__ 
    return self._finalCall(*args, **named) 
TypeError: 'NoneType' object is not callable 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "run.py", line 28, in <module> 
    obj = OBJ('robotbase.obj') 
    File "/home/warted/COMMAND CENTRE/SEDS/GUI/Simulate/objloader.py", line 97, in __init__ 
    glNormal3fv(self.normals[normals[i] - 1]) 
    File "/home/warted/anaconda3/lib/python3.6/site-packages/OpenGL/latebind.py", line 45, in __call__ 
    return self._finalCall(*args, **named) 
    File "/home/warted/anaconda3/lib/python3.6/site-packages/OpenGL/wrapper.py", line 677, in wrapperCall 
    pyArgs = tuple(calculate_pyArgs(args)) 
    File "/home/warted/anaconda3/lib/python3.6/site-packages/OpenGL/wrapper.py", line 438, in calculate_pyArgs 
    yield converter(args[index], self, args) 
    File "/home/warted/anaconda3/lib/python3.6/site-packages/OpenGL/arrays/arrayhelpers.py", line 112, in asArraySize 
    handler = typ.getHandler(incoming) 
    File "/home/warted/anaconda3/lib/python3.6/site-packages/OpenGL/arrays/arraydatatype.py", line 53, in __call__ 
    typ.__module__, type.__name__, repr(value)[:50] 
TypeError: ('No array-type handler for type builtins.type (value: <map object at 0x7f6bf0f8f4a8>) registered', <function asArrayTypeSize.<locals>.asArraySize at 0x7f6c01d6a620>) 
+1

항상 넣어 전체 오류 메시지 문제 (역 추적) (텍스트로하지 스크린 샷) – furas

+0

가 BTW : 파이썬에서 코드를 변환하는 2to3' 당신이 프로그램을 사용 않았다' 2에서 Python 3로? 파이썬 3에'2to3'을 설치해야합니다. – furas

+0

'raise'에 문제가 있다고 생각되면 파이썬 3 문서에서'raise'를 어떻게 사용했는지 체크 했습니까? – furas

답변

1

당신은 단지 변수 obj에 파일 이름을 지정하는 것 - 사람은 Python3

오류 나에게 정확한 objfileloader을 알 수 있습니다. 파이썬 포트에 linked answer 3 확인 스크립트를

obj = OBJ(filename) 

아웃 :

대신 당신은 OBJ 클래스의 인스턴스를 생성하고 파일/경로 이름을 전달해야합니다.


이 업데이트 된 버전을 시도해보십시오

import pygame 
from OpenGL.GL import * 

def MTL(filename): 
    contents = {} 
    mtl = None 
    for line in open(filename, "r"): 
     if line.startswith('#'): continue 
     values = line.split() 
     if not values: continue 
     if values[0] == 'newmtl': 
      mtl = contents[values[1]] = {} 
     elif mtl is None: 
      raise ValueError("mtl file doesn't start with newmtl stmt") 
     elif values[0] == 'map_Kd': 
      # load the texture referred to by this declaration 
      mtl[values[0]] = values[1] 
      surf = pygame.image.load(mtl['map_Kd']) 
      image = pygame.image.tostring(surf, 'RGBA', 1) 
      ix, iy = surf.get_rect().size 
      texid = mtl['texture_Kd'] = glGenTextures(1) 
      glBindTexture(GL_TEXTURE_2D, texid) 
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
       GL_LINEAR) 
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
       GL_LINEAR) 
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, ix, iy, 0, GL_RGBA, 
       GL_UNSIGNED_BYTE, image) 
     else: 
      mtl[values[0]] = list(map(float, values[1:])) 
    return contents 

class OBJ: 
    def __init__(self, filename, swapyz=False): 
     """Loads a Wavefront OBJ file. """ 
     self.vertices = [] 
     self.normals = [] 
     self.texcoords = [] 
     self.faces = [] 

     material = None 
     for line in open(filename, "r"): 
      if line.startswith('#'): continue 
      values = line.split() 
      if not values: continue 
      if values[0] == 'v': 
       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 = 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(list(map(float, values[1:3]))) 
      elif values[0] in ('usemtl', 'usemat'): 
       material = values[1] 
      elif values[0] == 'mtllib': 
       self.mtl = MTL(values[1]) 
      elif values[0] == 'f': 
       face = [] 
       texcoords = [] 
       norms = [] 
       for v in values[1:]: 
        w = v.split('/') 
        face.append(int(w[0])) 
        if len(w) >= 2 and len(w[1]) > 0: 
         texcoords.append(int(w[1])) 
        else: 
         texcoords.append(0) 
        if len(w) >= 3 and len(w[2]) > 0: 
         norms.append(int(w[2])) 
        else: 
         norms.append(0) 
       self.faces.append((face, norms, texcoords, material)) 

     self.gl_list = glGenLists(1) 
     glNewList(self.gl_list, GL_COMPILE) 
     glEnable(GL_TEXTURE_2D) 
     glFrontFace(GL_CCW) 
     for face in self.faces: 
      vertices, normals, texture_coords, material = face 

      mtl = self.mtl[material] 
      if 'texture_Kd' in mtl: 
       # use diffuse texmap 
       glBindTexture(GL_TEXTURE_2D, mtl['texture_Kd']) 
      else: 
       # just use diffuse colour 
       glColor(*mtl['Kd']) 

      glBegin(GL_POLYGON) 
      for i in range(len(vertices)): 
       if normals[i] > 0: 
        glNormal3fv(self.normals[normals[i] - 1]) 
       if texture_coords[i] > 0: 
        glTexCoord2fv(self.texcoords[texture_coords[i] - 1]) 
       glVertex3fv(self.vertices[vertices[i] - 1]) 
      glEnd() 
     glDisable(GL_TEXTURE_2D) 
     glEndList() 
+0

이미이 문제 (https://stackoverflow.com/questions/46609928/objfileloader-pygame/46611564#46611564)를 시도했지만 동일한 오류가 있습니다. – Warlord

+0

Thanks @skrx 업데이트 된 버전이 도움이되었습니다. 그것은 달렸다. 고맙습니다. :) – Warlord

+1

@skrx pygame.org로 보내거나 GitHub에 넣을 수 있습니다. – furas