Как загрузить и нарисовать файлы Collada в Pyglet и PyOpenGL - PullRequest
0 голосов
/ 26 апреля 2019

Я расширяю учебник Pyglet / PyOpenGL под названием «Учебник Pyglet OpenGL от DLC ENERGY (https://youtu.be/Hqg4qePJV2U).) У меня есть почти все необходимые коды OpenGL, такие как сглаживание, туман, источники света и т. Д. Сейчас я хочузагрузить 3D-модель в сцену с помощью модуля PyCollada. Загрузка файла collada достаточно проста, но как мне на самом деле нарисовать его в моем окне, чтобы он отображался в приложении?

Я новичок вPython и PyOpenGL, поэтому, пожалуйста, будьте осторожны.

Я знаю, что Assimp является окончательным способом загрузки 3D-моделей в Python и OpenGL, но PyCollada намного проще, и снова, я получил модель для загрузки без ошибок простонабрав "self.mesh = Collada ('AcrylicSphere.dae')", я просто хочу увидеть модель в игре без ошибок.

import sys
from collada import *
from pyglet.gl import *
from OpenGL.GLUT import *
from OpenGL.GL import *
from pyglet.window import key
import math
from Player import Player
from Model import Model


class ColladaImport():
    def __init__(self):
        self.mesh = Collada('AcrylicSphere.dae')

    def draw(self):
        self.mesh.draw()

class Window(pyglet.window.Window):

    def push(self,pos,rot): glPushMatrix(); rot = self.player.rot; glRotatef(-rot[0],1,0,0) ;glRotatef(-rot[1],0,1,0); glTranslatef(-pos[0],-pos[1],-pos[2],)
    def Projection(self): glMatrixMode(GL_PROJECTION); glLoadIdentity()
    def Model(self): glMatrixMode(GL_MODELVIEW); glLoadIdentity()
    def set2d(self): mself.Projection(); gluOrtho(0,self.width/self.height); self.Model()
    def set3d(self): self.Projection(); gluPerspective(70,self.width/self.height,0.05,1000); self.Model()


    def setLock(self,state): self.lock = state; self.set_exclusive_mouse(state)
    lock = False; mouse_lock = property(lambda self:self.lock,setLock)



    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.set_minimum_size(300,200)
        self.keys = key.KeyStateHandler()
        self.push_handlers(self.keys)
        pyglet.clock.schedule(self.update)

        self.model = Model()
        self.player = Player((0.5,1.5,1.5),(-30,0))
        self.test = ColladaImport()


    def on_mouse_motion(self,x,y,dx,dy):
        if self.mouse_lock: self.player.mouse_motion(dx,dy)

    def on_key_press(self,KEY,MOD):
        if KEY == key.ESCAPE: self.close()
        elif KEY == key.E: self.mouse_lock = not self.mouse_lock

    def update(self,dt):
        self.player.update(dt,self.keys)

    def on_draw(self):
        self.clear()
        self.set3d()
        self.push(self.player.pos,self.player.rot)
        self.model.draw()
        self.test.draw()
        glPopMatrix()

if __name__ == '__main__':
    window = Window(width=854,height=480,caption='Awesome Game',resizable=True)

    glClearColor(0.5,0.7,1,1)
    glEnable(GL_DEPTH_TEST)
    glEnable(GL_CULL_FACE)
    glShadeModel (GL_SMOOTH)


    #lighting (light #1)
    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glEnable(GL_NORMALIZE)
    light_position = [1.0, 1.0, 5.0, 0]
    glLight(GL_LIGHT0, GL_POSITION, light_position)

    glEnable(GL_COLOR_MATERIAL)
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE)
    glMaterialfv(GL_FRONT, GL_SPECULAR, [1.0, 1.0, 1.0, 1.0])
    glMaterialf(GL_FRONT, GL_SHININESS, 100.0)

    #fog
    glEnable(GL_FOG)
    fogColor = [0.5, 0.5, 0.5, 1.0]

    global fogMode
    fogMode = GL_EXP
    glFogi (GL_FOG_MODE, fogMode)
    glFogfv (GL_FOG_COLOR, fogColor)
    glFogf (GL_FOG_DENSITY, 0.35)
    glHint (GL_FOG_HINT, GL_DONT_CARE)
    glFogf (GL_FOG_START, 1.0)
    glFogf (GL_FOG_END, 5.0)

    #blending for billboard alpha textures
    glEnable (GL_BLEND)
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)

    #antialiasing
    glEnable (GL_LINE_SMOOTH)
    glEnable (GL_POLYGON_SMOOTH)
    glHint(GL_LINE_SMOOTH_HINT, GL_DONT_CARE)
    glLineWidth(1.5)

    #depth of field
    glAccum (GL_ACCUM, 0.125)

    #motion blur
    glAccum (GL_MULT, 0.5)
    glAccum (GL_RETURN, 1.0)

    pyglet.app.run()

И когда я ее запускаю, я получаю эту ошибку.

строка 17 в draw.. selfh.да шокогда я загружаю программу, вверх по экрану, как куб, который я сделал из учебника по DLC ENERGY.

...