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()