Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 渲染对象pyopengl_Python_Opengl_Rendering_Opengl Compat - Fatal编程技术网

Python 渲染对象pyopengl

Python 渲染对象pyopengl,python,opengl,rendering,opengl-compat,Python,Opengl,Rendering,Opengl Compat,请允许我在过去的几个月里一直在尝试这一点,但一切都成功了。我尝试了很多在线资源来阅读和显示没有MTl内容的OBJ文件,但都是徒劳的,我写的代码仍然错误,所以我最终得到了我自己制作的代码,可以阅读任何类型的OBJ文件,例如(v//vn)(v/by/vn)(v)我希望你能理解这一点。 读取文件后,我没有收到错误,但使用pyopengl渲染时,我没有收到错误,但对象没有显示。请检查我的obj加载程序代码,以及屏幕中的opengl代码,并在另一个屏幕截图中显示结果。 注意:我没有错误,我不知道我是否在o

请允许我在过去的几个月里一直在尝试这一点,但一切都成功了。我尝试了很多在线资源来阅读和显示没有MTl内容的OBJ文件,但都是徒劳的,我写的代码仍然错误,所以我最终得到了我自己制作的代码,可以阅读任何类型的OBJ文件,例如(v//vn)(v/by/vn)(v)我希望你能理解这一点。 读取文件后,我没有收到错误,但使用pyopengl渲染时,我没有收到错误,但对象没有显示。请检查我的obj加载程序代码,以及屏幕中的opengl代码,并在另一个屏幕截图中显示结果。 注意:我没有错误,我不知道我是否在obj加载程序中写了错误,但请检查并帮助我。 OBJ代码:

from OpenGL.GL import *
from pyopengltk import OpenGLFrame
class OBJ:
    def __init__(self,filename):
    self.faces = []
    self.vertices = []
    with open(filename, 'r') as f:
        lines = f.readlines()
        #print(lines)
        if lines:
            for line in lines:
                if line[0] == 'v':
                    index1 = line.find(' ')
                    index2 = line.find(' ', index1+1)
                    index3 = line.find(' ', index2+1)

                    v1 = float(line[index1: index2])
                    v2 = float(line[index2: index3])
                    v3 = float(line[index3:])
                    self.vertices.append((v1,v2,v3))
                    #print(self.vertices)
        for line in open(filename, "r"):
            face = []
            texcoords = []
            norms = []
            if line.startswith('#'): continue
            values = line.split()
            #print(values)
            if not values: continue
            if values[0] == 'v':continue
            elif values[0] == 'vn':continue
            elif values[0] == 'vt':continue
            if values[0] == 'f':
                for v in values[1:]:
                    #print(len(v))
                    if len(v) == 4:
                        if ['/' for s in values[1:]]:
                            w = v.split('//')
                            face.append(int(w[0]))
                            norms.append(int(w[1]))
                            self.faces.extend(tuple((face, norms)))
                            #self.faces = [y for x in self.faces for y in x]
                            #print(self.faces)
                            glBegin(GL_QUADS)
                            glColor3f(0,1,1)
                            for surface in self.faces:
                                for vertex in surface:
                                    glVertex3fv(self.vertices[vertex])
                            glEnd
                        else:
                            self.faces.append(v)
                            glBegin(GL_QUADS)
                            glColor3f(0,1,1)
                            for surface in self.faces:
                                for vertex in surface:
                                    glVertex3fv(self.vertices[vertex])
                            glEnd
                            print(self.faces)
                    elif len(v) == 3:
                        w = v.split('/')
                        face.append(int(w[0]))
                        texcoords.append(int(w[1]))
                        norms.append(int(w[2]))
                        self.faces.append((face, norms, texcoord))
                        glBegin(GL_TRIANGLES)
                        glColor3f(0,1,1)
                        for surface in self.faces:
                            for vertex in surface:
                                glVertex3fv(self.vertices[vertex])
                        glEnd
                        #print('v/vt/vn')
                        print(self.faces)
#to run this code just use file path to any obj file on your pc
#OBJ('filename_path')
                    
渲染代码

import tkinter as tk
from OpenGL.GL import *
from OpenGL.GLU import *
from pyopengltk import OpenGLFrame
from obj import *

class frame(OpenGLFrame):

  def initgl(self):
        glViewport(0,0,self.width,self.height)
        glClearColor(0.902,0.902,1,0.0)
        glMatrixMode(GL_PROJECTION)
        glLoadIdentity()
        #glOrtho(-10,10,-10,10,-10,10)
        gluPerspective(60, self.width/self.height,0.1,100.0)
        glEnable(GL_DEPTH_TEST)
        glEnable(GL_BLEND)
        glEnable(GL_CULL_FACE)
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        
  
  def redraw(self):
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
        OBJ('C:\\Users\\DANIEL\\Desktop\\v-cam\\me.obj')
        #that is what I did here obj suff
        glMatrixMode(GL_MODELVIEW)
        glLoadIdentity()
        gluLookAt(0,-10,0,0,0,0,1,0,20)
        

root = tk.Tk()
app = frame(root, width=900, height=600)
app.pack(fill=tk.BOTH,expand=tk.YES)
app.mainloop()

我建议使用您在前面的一个问题()中介绍的对象加载器

initgl
中创建一个
OBJ
实例:

self.obj=obj('C:\\Users\\DANIEL\\Desktop\\v-cam\\me.obj')
并用于在
重画中绘制网格

glCallList(self.obj.gl\u列表)

类框架(OpenGLFrame): def initgl(自身): glViewport(0,0,自宽,自高) glClearColor(0.902,0.902,1,0.0) glMatrixMode(GL_投影) glLoadIdentity() #格洛托(-10,10,-10,10,-10,10) 透视图(60,自宽/自高,0.1100.0) glEnable(GL_深度_测试) glEnable(GL_混合) glEnable(GL_CULL_面) glMatrixMode(GLU模型视图) glLoadIdentity() self.obj=obj('C:\\Users\\DANIEL\\Desktop\\v-cam\\me.obj') def重绘(自): glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位) glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA) #这就是我在这里所做的 glMatrixMode(GLU模型视图) glLoadIdentity() gluLookAt(0,-10,0,0,0,0,1,0,20) glCallList(self.obj.gl_列表)
我建议使用您在前面的一个问题()中介绍的对象加载器

initgl
中创建一个
OBJ
实例:

self.obj=obj('C:\\Users\\DANIEL\\Desktop\\v-cam\\me.obj')
并用于在
重画中绘制网格

glCallList(self.obj.gl\u列表)

类框架(OpenGLFrame): def initgl(自身): glViewport(0,0,自宽,自高) glClearColor(0.902,0.902,1,0.0) glMatrixMode(GL_投影) glLoadIdentity() #格洛托(-10,10,-10,10,-10,10) 透视图(60,自宽/自高,0.1100.0) glEnable(GL_深度_测试) glEnable(GL_混合) glEnable(GL_CULL_面) glMatrixMode(GLU模型视图) glLoadIdentity() self.obj=obj('C:\\Users\\DANIEL\\Desktop\\v-cam\\me.obj') def重绘(自): glClear(GL_颜色_缓冲区_位| GL_深度_缓冲区_位) glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA) #这就是我在这里所做的 glMatrixMode(GLU模型视图) glLoadIdentity() gluLookAt(0,-10,0,0,0,0,1,0,20) glCallList(self.obj.gl_列表)
您真的在每帧加载对象吗?在我看来,您可能缺少
glEnd
后面的括号?不要将代码作为图像发布,这对任何人都没有帮助。如果你需要适当的帮助,做一个好的。请刷新页面,我已经添加了所有必要的细节。不,你没有。obj构造函数中的缩进错误。没有关于如何编译程序的信息-第一个文件是obj.py?当我运行它时,我(显然)得到
FileNotFoundError:[Errno 2]没有这样的文件或目录:'C:\\Users\\DANIEL\\Desktop\\v-cam\\me.obj'
。你越容易让别人运行你的代码,别人就有机会回答。你试着加括号了吗?这肯定是一个错误,也是问题的一部分。*在渲染部分使用OBJ(文件名)运行代码的更好机会!,。在文件名中输入电脑上的任何obj文件路径。检查代码,你会看到我添加了它。你真的在每帧加载对象吗?在我看来,您可能缺少
glEnd
后面的括号?不要将代码作为图像发布,这对任何人都没有帮助。如果你需要适当的帮助,做一个好的。请刷新页面,我已经添加了所有必要的细节。不,你没有。obj构造函数中的缩进错误。没有关于如何编译程序的信息-第一个文件是obj.py?当我运行它时,我(显然)得到
FileNotFoundError:[Errno 2]没有这样的文件或目录:'C:\\Users\\DANIEL\\Desktop\\v-cam\\me.obj'
。你越容易让别人运行你的代码,别人就有机会回答。你试着加括号了吗?这肯定是一个错误,也是问题的一部分。*在渲染部分使用OBJ(文件名)运行代码的更好机会!,。在文件名中输入电脑上的任何obj文件路径。检查代码,您将看到我添加了它