python - Pyopengl 读取 obj 文件
问题描述
我试图用 pyopengl 读取 obj 文件,但错误来自 glGenList(1) 我只想读取文件并在 opengl 中显示 请你帮我提供完整的代码;
厌倦了堆栈和错误,我花了 3 个小时才从 OpenGL.GL import * from tkinter import messagebox import sys 发布这个
filename = input('pls input file path: ')
class OBJ:
def __init__(self, filename, swapyz=False):
"""Loads a Wavefront OBJ file. """
self.vertices = []
self.normals = []
self.texcoords = []
self.faces = []
material = None
for line in open(filename, "r"):
if line.startswith('#'): continue
values = line.split()
#print(values)
if not values: continue
if values[0] == 'v':
v = list(map(float, values[1:4]))
if swapyz:
v = (v[0], v[2], v[1])
self.vertices.append(v)
elif values[0] == 'vn':
v = list(map(float, values[1:4]))
if swapyz:
v = (v[0], v[2], v[1])
self.normals.append(v)
elif values[0] == 'vt':
self.texcoords.append(map(float, values[1:3]))
elif values[0] == 'mtllib':
continue
elif values[0] == 'f':
face = []
texcoords = []
norms = []
for v in values[1:]:
w = v.split('/')
face.append(int(w[0]))
if len(w) >= 2 and len(w[1]) > 0:
texcoords.append(int(w[1]))
else:
texcoords.append(0)
if len(w) >= 3 and len(w[2]) > 0:
norms.append(int(w[2]))
else:
norms.append(0)
self.faces.append((face, norms, texcoords))
#print(self.faces)
self.gl_list = glGenLists(0)
glNewList(self.gl_list, GL_COMPILE)
#glEnable(GL_TEXTURE_2D)
#glFrontFace(GL_CCW)
for face in self.faces:
vertices, normals, texture_coords = face
glBegin(GL_POLYGON)
for i in range(len(vertices)):
if normals[i] > 0:
glNormal3fv(self.normals[normals[i] - 1])
if texture_coords[i] > 0:
glTexCoord2fv(self.texcoords[texture_coords[i] - 1])
glVertex3fv(self.vertices[vertices[i] - 1])
glEnd()
glEndList()
OBJ(filename,swapyz=True)
解决方案
对于任何 OpenGL 指令,都需要有效且当前的OpenGL 上下文。在创建显示列表之前,请确保您已经创建了 OpenGL 窗口。
有第二个问题,glNewList
在第一个问题解决后,调用时会导致错误。您要创建超过 1 个显示列表对象,因此 to 的参数glGenLists
必须至少为 1:
self.gl_list = glGenLists(0)
self.gl_list = glGenLists(1)
推荐阅读
- javascript - execCommand h1 样式仅选定文本
- php - 如何获取在 MySQL 查询中传递的数据
- ios - 如何制作像这样粘在顶部的分段控制器?
- php - 将所有get参数传递给另一个链接php
- macos - Xamarin.Mac PdfView 性能问题
- python - 是否可以在 python 中定义一个新的数学运算符?
- mongodb - 通过数组内部文档的 id 更新数组中的文档,但是如果该 id 的文档在数组中不存在,则在 mongodb 中创建一个具有该 ID 的文档
- python - 无法从 pipenv virtualenv 导入 pyspark,因为它找不到 py4j
- python - 如何从 Instagram 中提取数据?
- django - drf-yasg 如何在外面显示 api 描述?