python - PyOpenGL OBJ 加载器未正确加载
问题描述
我按照教程制作了一个 OBJ 加载器,我们最终得到了大致相同的结果。我的加载不正确,所以我复制了他的,他的加载不正确。遗憾的是,我不得不去,而且我的代码重叠了,所以我不能展示它,但这是他的。
import numpy as np
class ObjLoader:
def __init__(self):
self.vert_coords = []
self.text_coords = []
self.norm_coords = []
self.vertex_index = []
self.texture_index = []
self.normal_index = []
self.model = []
def load_model(self, file):
for line in open(file, 'r'):
if line.startswith('#'): continue
values = line.split()
if not values: continue
if values[0] == 'v':
self.vert_coords.append(values[1:4])
if values[0] == 'vt':
self.text_coords.append(values[1:3])
if values[0] == 'vn':
self.norm_coords.append(values[1:4])
if values[0] == 'f':
face_i = []
text_i = []
norm_i = []
for v in values[1:4]:
w = v.split('/')
face_i.append(int(w[0])-1)
text_i.append(int(w[1])-1)
norm_i.append(int(w[2])-1)
self.vertex_index.append(face_i)
self.texture_index.append(text_i)
self.normal_index.append(norm_i)
self.vertex_index = [y for x in self.vertex_index for y in x]
self.texture_index = [y for x in self.texture_index for y in x]
self.normal_index = [y for x in self.normal_index for y in x]
for i in self.vertex_index:
self.model.extend(self.vert_coords[i])
for i in self.texture_index:
self.model.extend(self.text_coords[i])
for i in self.normal_index:
self.model.extend(self.norm_coords[i])
self.model = np.array(self.model, dtype='float32')
然后在我的 main.py 上,我用文件名执行了文件。
obj = ObjLoader()
obj.load_model('cube2.obj')
shader = ShaderLoader.compile_shader("Shaders/vert.vs", "Shaders/frag.fs")
OBJ 文件:http ://hatebin.com/adycgbuhgt
# Blender v2.79 (sub 0) OBJ File: ''
# www.blender.org
mtllib cube2.mtl
o Cube
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.000000 1.000000 -0.999999
v 0.999999 1.000000 1.000001
v -1.000000 1.000000 1.000000
v -1.000000 1.000000 -1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 0.000000 1.000000
vt 0.000000 0.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 1.000000 0.000000
vt 1.000000 1.000000
vt 0.000000 1.000000
vn 0.0000 -1.0000 0.0000
vn 0.0000 1.0000 0.0000
vn 1.0000 0.0000 0.0000
vn -0.0000 -0.0000 1.0000
vn -1.0000 -0.0000 -0.0000
vn 0.0000 0.0000 -1.0000
usemtl Material
s off
f 1/1/1 2/2/1 3/3/1 4/4/1
f 5/5/2 8/6/2 7/7/2 6/8/2
f 1/1/3 5/9/3 6/10/3 2/11/3
f 2/12/4 6/13/4 7/7/4 3/14/4
f 3/15/5 7/16/5 8/17/5 4/4/5
f 5/5/6 1/18/6 4/19/6 8/20/6
结果:
解决方案
为了显示一个 obj 文件,我的脚本以三角形的形式绘制了 3 个顶点。我必须在搅拌机中对我的模型进行三角测量,以便在我的程序中绘制三角形并用 UV 展开它以获得我的 VT 坐标。
推荐阅读
- jpa - Spring Data JPA - 孩子的选择性持久性
- java - LocalDateTime 字段:MismatchedInputException:无法从 START_OBJECT 令牌中反序列化 `java.lang.String` 的实例
- apache-kafka - 使用 Rest 代理连接到主题
- google-apps-script - 使用 Google 日历的 ID 创建事件:Google 脚本
- html - 嵌套在 div 中的更大和更小的 font-size span 使 div 太高
- typescript - 如何防止泛型类型将“任何”作为其类型参数?
- python - 如何在 Python 中使用 help()?
- iis - 使用 iisnode 重写动词 PUT 和 DELETE 的 URL
- spring-data-jpa - 如何根据我在 spring data jpa 中的选择放置主键的值
- python - Python多线程for循环减慢代码