IzikAJ
У меня похожая была проблема, только у меня оказалось что нельзя создать массив Vertices из более 256 элементов…
Вот код модуля может он и не роботает тогда нужно подправить я много раз правил и уже не помню исходную версию.
Может кто разбирьотся в чем здесь суть. Или покажет как правильно написать. В коде есть ( code] его нужно исправить, а то так не печает на форум.
# -*- coding: utf-8 -*-
import glcanvas, e32, appuifw,powlite_fm
from math import *
from gles import *
from graphics import Image
from key_codes import *
from time import *
#Импорт модуля парсинга obj
import Engine.model_parser as model_parser
#Класс для роботи с клавиатурой
class Keyboard(object):
    def __init__(self,onevent=lambda:None):
      self._keyboard_state={}
      self._downs={}
      self._onevent=onevent
    def handle_event(self,event):
      if event == appuifw.EEventKeyDown:
        code=event
        if not self.is_down(code):
          self._downs( code]=self._downs.get(code,0)+1
        self._keyboard_state( code]=1
      elif event == appuifw.EEventKeyUp:
        self._keyboard_state[event]=0
      self._onevent()
    def is_down(self,scancode):
      return self._keyboard_state.get(scancode,0)
    def pressed(self,scancode):
      if self._downs.get(scancode,0):
        self._downs-=1
        return True
      return False
global obj
#У всіх 3 списках списку імен, вершин, полігонів індекси відповідають, тобто по першому індексу в names розміщена назва першої моделі, по першому індексу в vertices розміщений список вершин цього обєкта, по першому індексу в faces розміщений список полігонів цього обєкта
#Model_Parser передается путь к obj а он возвращает обект с полями vertices (списки списков вершин) names(список имен) faces(список списков индексов вершин для полигонов) при чем в кажом масиве каждой модели отвичает соответственний индекс например
#первая модель ее имя находится по индексу 0 в масиве names, значит список ее вершин по индексе 0 в масиве vertices, и список индексов вершин для полигонов по идексу 0 в списке faces. Так из однонво obj можна загрузить несколько обєктов - сцену.    
#——————————————–#
#——————-Enginee——————#
#——————————————–#
class Engine:
  global vertex,model,vertic,image,texcoords,textures
  obj=(model_parser.load_obj(powlite_fm.manager().AskUser(ext=)))#Загружаем модель заранее так как vertex model другие переменние не инициализируются с пустими свойствами 
  keyboard = Keyboard()       
  #Задаем масив сершин для модели    
  vertex=array(GL_FLOAT,3,obj.vertices)    
  #Задаем массив с индексами полигонов для модели
  model=array(GL_UNSIGNED_BYTE,3,obj.faces)      
  alpha, x, y = 0, 0, 0
  a, d = 0, 0      
  #Инициализаця движка
  def __init__(self):
    self.run = True
    appuifw.app.screen = ‘full’
    self.canvas = glcanvas.GLCanvas(event_callback = self.keyboard.handle_event ,redraw_callback = self.redraw)
    appuifw.app.body = self.canvas
    appuifw.app.exit_key_handler = self.set_exit
    self.initgl()
    while self.run:
      self.canvas.drawNow()
      e32.ao_sleep(.0001)      
  def set_exit(self):
    self.run = False
    del(self.canvas)
  #Инициализация GLES
  def initgl(self):    glViewport(0, 0, self.canvas.size, self.canvas.size)
    glClearColor(0.0, 0.0, 0.0, 1.0)
    glShadeModel(GL_SMOOTH)    
    glMatrixMode(GL_PROJECTION) 
    glLoadIdentity()
    aspect = float(self.canvas.size) / float(self.canvas.size)
    glFrustumf(-1.0, 1.0, aspect*-1.0, aspect*1.0, 3.0, 100.0)
    glMatrixMode(GL_MODELVIEW)  
    glEnableClientState(GL_VERTEX_ARRAY)	
    #glClearDepthf(10.0)      
    #glEnable(GL_TEXTURE_2D)    
  #Функция которая при нажатии клавиш меняет координати камери
  def rul(self):
    if self.keyboard.is_down(EScancodeUpArrow):
      self.d = -1
    elif self.keyboard.is_down(EScancodeDownArrow):
      self.d = 1
    elif self.keyboard.is_down(EScancodeLeftArrow):
      self.a = -4
    elif self.keyboard.is_down(EScancodeRightArrow):
      self.a = 4
  #Функция вращения в пространстве камери
  def rotate(self):
    self.a -= (self.a/3.)
    self.alpha += self.a
    if -0.5 < self.a < 0.5: self.a = 0
  #Функция перемещения в пространстве камери
  def muve(self):
    self.d -= (self.d/8.)
    self.x += self.d * sin((self.alpha/180.0)*pi)
    self.y -= self.d * cos((self.alpha/180.0)*pi)
    if -0.5 < self.d < 0.5: self.d = 0   
  #Функция Отрисовки
  def redraw(self, frame):
    self.iFrame = frame
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity()
    self.rul()
    self.muve()
    self.rotate()
    glRotatef(self.alpha,0.,1.,0.)
    glTranslatef(self.x,0.,self.y) 	 
    glVertexPointerf(vertex)#Задаем массив вершин    
    glColor4f(0.,0.,1.,1.)#Задаєм 1 цве для отрисовки    
    glDrawElementsub(GL_TRIANGLES,model)#Отрисовуем модель триугольниками        
def quit():
     if appuifw.query(u'Вийти ?','query')==1:       
       script_lock.signal() 
       #appuifw.app.set_exit()      
obj=(model_parser.load_obj(powlite_fm.manager().AskUser(ext=)))#Откриваем через диалог .obj модель
engine=Engine()#Создаем класс движка и в нем инициализируются все функции
appuifw.app.menu=[
(u'Exit',quit)]
script_lock=e32.Ao_lock()
script_lock.wait()