Найти - Пользователи
Полная версия: Неправильно отображаются модели в Mobile Python + Gles
Начало » Mobile Python » Неправильно отображаются модели в Mobile Python + Gles
1
WarChief
Вот кусок кода движка, в нем я уже пару месяцев не могу найти ошибку. Код загружает obj файл как массив вершин и отображает модель (пока без текстурирования). Когда в ручную вписать координаты модели списком в коде тогда вроде правильно отображается, но когда распарсить obj файл на список vertices и faces, и попробовать его отобразить то модели стают какие то дырявие, неправильные. В чом здесь дело.

силка на код - http://open-soft.at.ua/Public_Open_Render.py
IzikAJ
У меня похожая была проблема, только у меня оказалось что нельзя создать массив Vertices из более 256 элементов…
WarChief
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()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB