Ver Mensaje Individual
  #4 (permalink)  
Antiguo 07/12/2010, 09:52
Avatar de razpeitia
razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: necesita ayuda con python y opengl

Si las instancias las haces en el main.

En cuanto a la estructura de las clases no se exactamente como funcionen, ya que no están documentadas y no parece ser intuitivo el uso de esas clases.

Hay muchas cosas que se pueden simplificar, por ejemplo en lugar de has_key para saber si un diccionario tiene un elemento pudiste haber usado el operador in.

En vez de importar string y usar atof, pudiste haber usado float.

Aquí dejo el script, formateado bonito y en un solo archivo.
Código Python:
Ver original
  1. import string
  2. from OpenGL.GL import *
  3. from OpenGL.GLU import *
  4. from OpenGL.GLUT import *
  5. import Image
  6.  
  7.  
  8. class Texture2D:
  9.     def __init__(self, file, wrap=GL_REPEAT, minFilter=GL_LINEAR, magFilter=GL_LINEAR, texenv=GL_MODULATE):
  10.         self.file = file
  11.         self.wrapS = wrap
  12.         self.wrapT = wrap
  13.         self.minFilter = minFilter
  14.         self.magFilter = magFilter
  15.         self.texenv = texenv
  16.         self.defined = False
  17.         self.id = 0
  18.  
  19.     def define(self):
  20.         img = Image.open(self.file).transpose(Image.FLIP_TOP_BOTTOM).convert('RGBA')
  21.         width = 2
  22.         while width < img.size[0]: width *= 2
  23.         width /= 2
  24.         height = 2
  25.         while height < img.size[1]: height *= 2
  26.         height /= 2
  27.         if (width != img.size[0]) or (height != img.size[1]):
  28.             img = img.resize((width,height))
  29.        
  30.         self.id = glGenTextures(1)
  31.         glBindTexture(GL_TEXTURE_2D, self.id)
  32.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, self.wrapS)
  33.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, self.wrapT)
  34.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, self.minFilter)
  35.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, self.magFilter)
  36.         if (self.minFilter == GL_NEAREST_MIPMAP_NEAREST) or \
  37.            (self.minFilter == GL_NEAREST_MIPMAP_LINEAR) or \
  38.            (self.minFilter == GL_LINEAR_MIPMAP_NEAREST) or \
  39.            (self.minFilter == GL_LINEAR_MIPMAP_LINEAR):
  40.             gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, img.size[0], img.size[1],
  41.                                 GL_RGBA, GL_UNSIGNED_BYTE, img.tostring())
  42.         else:
  43.             glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.size[0], img.size[1],
  44.                            0, GL_RGBA, GL_UNSIGNED_BYTE, img.tostring())
  45.         glBindTexture(GL_TEXTURE_2D, 0)
  46.         self.defined = True
  47.  
  48.     def apply(self):
  49.         if not self.defined:
  50.             self.define()
  51.         glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, self.texenv)
  52.         glBindTexture(GL_TEXTURE_2D, self.id)
  53.         if self.id != 0:
  54.             glEnable(GL_TEXTURE_2D)
  55.         else:
  56.             glDisable(GL_TEXTURE_2D)
  57.  
  58.     def disable(self):
  59.         glBindTexture(GL_TEXTURE_2D, 0)
  60.         glDisable(GL_TEXTURE_2D)
  61.  
  62. #despues tengo el cargador de modelo ke se llama LOADEROBJ.py:
  63.  
  64. class OBJFace:
  65.     def __init__(self, vertices, normals, texcoords, obj):
  66.         self.vertices = vertices
  67.         self.normals = normals
  68.         self.texcoords = texcoords
  69.         self.obj = obj
  70.     def draw(self):
  71.         glBegin(GL_POLYGON)
  72.         for i in range(0, len(self.vertices)):
  73.             if self.normals[i] > 0:
  74.                 glNormal3fv(self.obj.normals[self.normals[i] - 1])
  75.             if self.texcoords[i] > 0:
  76.                 glTexCoord2fv(self.obj.texcoords[self.texcoords[i] - 1])
  77.             glVertex3fv(self.obj.vertices[self.vertices[i] - 1])
  78.         glEnd()
  79.  
  80. class OBJUseMtl:
  81.     def __init__(self, mtl):
  82.         self.material = mtl
  83.     def draw(self):
  84.         if self.material.has_key('Ka'):
  85.             glMaterialfv(GL_FRONT, GL_AMBIENT, self.material['Ka'])
  86.         else:
  87.             glMaterialfv(GL_FRONT, GL_AMBIENT, [0, 0, 0, 0])
  88.         if self.material.has_key('Kd'):
  89.             glMaterialfv(GL_FRONT, GL_DIFFUSE, self.material['Kd'])
  90.         else:
  91.             glMaterialfv(GL_FRONT, GL_DIFFUSE, [0, 0, 0, 0])
  92.         if self.material.has_key('Ks'):
  93.             glMaterialfv(GL_FRONT, GL_SPECULAR, self.material['Ks'])
  94.         else:
  95.             glMaterialfv(GL_FRONT, GL_SPECULAR, [0, 0, 0, 0])
  96.         if self.material.has_key('Ns'):
  97.             glMaterialf(GL_FRONT, GL_SHININESS, self.material['Ns'])
  98.         if self.material.has_key('map_Kd'):
  99.             self.material['map_Kd'].apply()
  100.         else:
  101.             glDisable(GL_TEXTURE_2D)
  102.  
  103. class OBJFile:
  104.     def __init__(self, filename):
  105.         self.vertices = []
  106.         self.normals = []
  107.         self.texcoords = []
  108.         self.materials = {}
  109.         self.commands = []
  110.         file = open(filename, "r")
  111.         lines = file.readlines()
  112.         for line in lines:
  113.             values = string.split(line)
  114.             if len(values) < 1:
  115.                 continue
  116.             if values[0] == 'v':
  117.                 x = string.atof(values[1])
  118.                 y = string.atof(values[2])
  119.                 z = string.atof(values[3])
  120.                 self.vertices.append([x,y,z])
  121.             elif values[0] == 'vn':
  122.                 x = string.atof(values[1])
  123.                 y = string.atof(values[2])
  124.                 z = string.atof(values[3])
  125.                 self.normals.append([x,y,z])
  126.             elif values[0] == 'vt':
  127.                 s = string.atof(values[1])
  128.                 t = string.atof(values[2])
  129.                 self.texcoords.append([s,t])
  130.             elif values[0] == 'mtllib':
  131.                 self.loadMtllib(values[1])
  132.             elif values[0] == 'f':
  133.                 face = []
  134.                 texcoords = []
  135.                 for v in values[1:]:
  136.                     w = string.split(v,'/')
  137.                     face.append(string.atoi(w[0]))
  138.                     if len(w) >= 2 and len(w[1]) > 0:
  139.                         texcoords.append(string.atoi(w[1]))
  140.                     else:
  141.                         texcoords.append(0)
  142.  
  143. def dibujar():
  144.     #limpia la pantalla y el buffer de profundidad
  145.     glClearColor(0, 0, 0, 0)
  146.     glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT)
  147.     glLoadIdentity()
  148.    
  149.    
  150.  
  151.     glutSwapBuffers()
  152.    
  153.    
  154. def main():
  155.     glutInit(())
  156.     glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA)
  157.     glutInitWindowSize(600,600)
  158.     glutInitWindowPosition(0,0)
  159.     glutCreateWindow("hola")
  160.     glutDisplayFunc(dibujar)
  161.        
  162.     glutMainLoop()
  163.  
  164. main()