PyOpenGL 如何导入 obj 文件?
PyOpenGL how do I import an obj file?
import pygame
import OpenGL
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import pywavefront
scene = pywavefront.Wavefront('Handgun_obj.obj')
vertices =(
(1,-1,-1),
(1,1,-1),
(-1,1,-1),
(-1,-1,-1),
(1,-1,1),
(1,1,1),
(-1,-1,1),
(-1,1,1),
)
edges = (
(0,1),
(0,3),
(0,4),
(2,1),
(2,3),
(2,7),
(6,3),
(6,4),
(6,7),
(5,1),
(5,4),
(5,7)
)
colors = (
(1,0,0),
(0,1,0),
(0,0,1),
(0,1,0),
(1,1,1),
(0,1,1),
(1,0,0),
(0,1,0),
(0,0,1),
(1,0,0),
(1,1,1),
(0,1,1),
)
surfaces = (
(0,1,2,3),
(3,2,7,6),
(6,7,5,4),
(4,5,1,0),
(1,5,7,2),
(4,0,3,6)
)
def Cube():
glBegin(GL_QUADS)
for surface in surfaces:
x = 0
for vertex in surface:
x += 1
glColor3fv(colors[x])
glVertex3fv(vertices[vertex])
glEnd()
glBegin(GL_LINES) #tells OpenGL dass code erhalten wird der als line-drawing code benutzt wird
for edge in edges:
for vertex in edge:
glVertex3fv(vertices[vertex])
glEnd()
def main():
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
gluPerspective(45, (display[0] / display[1]), 1, 500.0)
glTranslatef(0.0, 0.0, -10)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
glTranslatef(-0.5,0,0)
if event.key == pygame.K_RIGHT:
glTranslatef(0.5,0,0)
if event.key == pygame.K_UP:
glTranslatef(0,1,0)
if event.key == pygame.K_DOWN:
glTranslatef(0,-1,0)
glRotatef(1, 5, 1, 1)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
Cube()
pygame.display.flip()
pygame.time.wait(10)
main()
现在我想用立方体将场景添加到我的 window 中或替换它
有人能告诉我如何实现吗?
找不到太多关于如何在 opengl 和 pygame
中正确使用波前的信息
opengl 编程新手
所以我想我必须从我的场景中添加新的顶点对吧?
我现在想添加 obj 以了解如何将 blender 模型导入游戏
谢谢
设置关键字参数collect_faces = True
,当你阅读Wavefront .obj file。这导致为每个网格收集三角形面数据。:
(参见 PyWavefront)
scene = pywavefront.Wavefront('Handgun_obj.obj', collect_faces=True)
计算场景框。顶点包含在 scene.vertices
中。每个顶点是具有 3 个分量(x、y、z 坐标)的元组:
scene_box = (scene.vertices[0], scene.vertices[0])
for vertex in scene.vertices:
min_v = [min(scene_box[0][i], vertex[i]) for i in range(3)]
max_v = [max(scene_box[1][i], vertex[i]) for i in range(3)]
scene_box = (min_v, max_v)
计算将对象中心移动到原点的平移和将对象缩放到定义大小的比例 (scaled_size
):
scene_trans = [-(scene_box[1][i]+scene_box[0][i])/2 for i in range(3)]
scaled_size = 5
scene_size = [scene_box[1][i]-scene_box[0][i] for i in range(3)]
max_scene_size = max(scene_size)
scene_scale = [scaled_size/max_scene_size for i in range(3)]
每个场景都由网格 (scene.mesh_list
) 组成,每个网格都有三角形面 (mesh.faces
)。每个 fac 是一个包含 3 个独立点的数组,它们引用顶点数组 [scene.vertices
]。创建一个设置比例和平移的函数,并在嵌套循环中绘制模型:
def Model():
glPushMatrix()
glScalef(*scene_scale)
glTranslatef(*scene_trans)
for mesh in scene.mesh_list:
glBegin(GL_TRIANGLES)
for face in mesh.faces:
for vertex_i in face:
glVertex3f(*scene.vertices[vertex_i])
glEnd()
glPopMatrix()
另见 PyGame and OpenGL immediate mode (Legacy OpenGL)
最小示例 (Stanford bunny):
repl.it/@Rabbid76/pygame-opengl-wavefront-obj
import pygame
import OpenGL
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import pywavefront
scene = pywavefront.Wavefront('bunny.obj', collect_faces=True)
scene_box = (scene.vertices[0], scene.vertices[0])
for vertex in scene.vertices:
min_v = [min(scene_box[0][i], vertex[i]) for i in range(3)]
max_v = [max(scene_box[1][i], vertex[i]) for i in range(3)]
scene_box = (min_v, max_v)
scene_size = [scene_box[1][i]-scene_box[0][i] for i in range(3)]
max_scene_size = max(scene_size)
scaled_size = 5
scene_scale = [scaled_size/max_scene_size for i in range(3)]
scene_trans = [-(scene_box[1][i]+scene_box[0][i])/2 for i in range(3)]
def Model():
glPushMatrix()
glScalef(*scene_scale)
glTranslatef(*scene_trans)
for mesh in scene.mesh_list:
glBegin(GL_TRIANGLES)
for face in mesh.faces:
for vertex_i in face:
glVertex3f(*scene.vertices[vertex_i])
glEnd()
glPopMatrix()
def main():
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
gluPerspective(45, (display[0] / display[1]), 1, 500.0)
glTranslatef(0.0, 0.0, -10)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
glTranslatef(-0.5,0,0)
if event.key == pygame.K_RIGHT:
glTranslatef(0.5,0,0)
if event.key == pygame.K_UP:
glTranslatef(0,1,0)
if event.key == pygame.K_DOWN:
glTranslatef(0,-1,0)
glRotatef(1, 5, 1, 1)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
Model()
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
pygame.display.flip()
pygame.time.wait(10)
main()
import pygame
import OpenGL
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import pywavefront
scene = pywavefront.Wavefront('Handgun_obj.obj')
vertices =(
(1,-1,-1),
(1,1,-1),
(-1,1,-1),
(-1,-1,-1),
(1,-1,1),
(1,1,1),
(-1,-1,1),
(-1,1,1),
)
edges = (
(0,1),
(0,3),
(0,4),
(2,1),
(2,3),
(2,7),
(6,3),
(6,4),
(6,7),
(5,1),
(5,4),
(5,7)
)
colors = (
(1,0,0),
(0,1,0),
(0,0,1),
(0,1,0),
(1,1,1),
(0,1,1),
(1,0,0),
(0,1,0),
(0,0,1),
(1,0,0),
(1,1,1),
(0,1,1),
)
surfaces = (
(0,1,2,3),
(3,2,7,6),
(6,7,5,4),
(4,5,1,0),
(1,5,7,2),
(4,0,3,6)
)
def Cube():
glBegin(GL_QUADS)
for surface in surfaces:
x = 0
for vertex in surface:
x += 1
glColor3fv(colors[x])
glVertex3fv(vertices[vertex])
glEnd()
glBegin(GL_LINES) #tells OpenGL dass code erhalten wird der als line-drawing code benutzt wird
for edge in edges:
for vertex in edge:
glVertex3fv(vertices[vertex])
glEnd()
def main():
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
gluPerspective(45, (display[0] / display[1]), 1, 500.0)
glTranslatef(0.0, 0.0, -10)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
glTranslatef(-0.5,0,0)
if event.key == pygame.K_RIGHT:
glTranslatef(0.5,0,0)
if event.key == pygame.K_UP:
glTranslatef(0,1,0)
if event.key == pygame.K_DOWN:
glTranslatef(0,-1,0)
glRotatef(1, 5, 1, 1)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
Cube()
pygame.display.flip()
pygame.time.wait(10)
main()
现在我想用立方体将场景添加到我的 window 中或替换它
有人能告诉我如何实现吗?
找不到太多关于如何在 opengl 和 pygame
中正确使用波前的信息opengl 编程新手
所以我想我必须从我的场景中添加新的顶点对吧?
我现在想添加 obj 以了解如何将 blender 模型导入游戏
谢谢
设置关键字参数collect_faces = True
,当你阅读Wavefront .obj file。这导致为每个网格收集三角形面数据。:
(参见 PyWavefront)
scene = pywavefront.Wavefront('Handgun_obj.obj', collect_faces=True)
计算场景框。顶点包含在 scene.vertices
中。每个顶点是具有 3 个分量(x、y、z 坐标)的元组:
scene_box = (scene.vertices[0], scene.vertices[0])
for vertex in scene.vertices:
min_v = [min(scene_box[0][i], vertex[i]) for i in range(3)]
max_v = [max(scene_box[1][i], vertex[i]) for i in range(3)]
scene_box = (min_v, max_v)
计算将对象中心移动到原点的平移和将对象缩放到定义大小的比例 (scaled_size
):
scene_trans = [-(scene_box[1][i]+scene_box[0][i])/2 for i in range(3)]
scaled_size = 5
scene_size = [scene_box[1][i]-scene_box[0][i] for i in range(3)]
max_scene_size = max(scene_size)
scene_scale = [scaled_size/max_scene_size for i in range(3)]
每个场景都由网格 (scene.mesh_list
) 组成,每个网格都有三角形面 (mesh.faces
)。每个 fac 是一个包含 3 个独立点的数组,它们引用顶点数组 [scene.vertices
]。创建一个设置比例和平移的函数,并在嵌套循环中绘制模型:
def Model():
glPushMatrix()
glScalef(*scene_scale)
glTranslatef(*scene_trans)
for mesh in scene.mesh_list:
glBegin(GL_TRIANGLES)
for face in mesh.faces:
for vertex_i in face:
glVertex3f(*scene.vertices[vertex_i])
glEnd()
glPopMatrix()
另见 PyGame and OpenGL immediate mode (Legacy OpenGL)
最小示例 (Stanford bunny):
import pygame
import OpenGL
from pygame.locals import *
from OpenGL.GL import *
from OpenGL.GLU import *
import pywavefront
scene = pywavefront.Wavefront('bunny.obj', collect_faces=True)
scene_box = (scene.vertices[0], scene.vertices[0])
for vertex in scene.vertices:
min_v = [min(scene_box[0][i], vertex[i]) for i in range(3)]
max_v = [max(scene_box[1][i], vertex[i]) for i in range(3)]
scene_box = (min_v, max_v)
scene_size = [scene_box[1][i]-scene_box[0][i] for i in range(3)]
max_scene_size = max(scene_size)
scaled_size = 5
scene_scale = [scaled_size/max_scene_size for i in range(3)]
scene_trans = [-(scene_box[1][i]+scene_box[0][i])/2 for i in range(3)]
def Model():
glPushMatrix()
glScalef(*scene_scale)
glTranslatef(*scene_trans)
for mesh in scene.mesh_list:
glBegin(GL_TRIANGLES)
for face in mesh.faces:
for vertex_i in face:
glVertex3f(*scene.vertices[vertex_i])
glEnd()
glPopMatrix()
def main():
pygame.init()
display = (800, 600)
pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
gluPerspective(45, (display[0] / display[1]), 1, 500.0)
glTranslatef(0.0, 0.0, -10)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
glTranslatef(-0.5,0,0)
if event.key == pygame.K_RIGHT:
glTranslatef(0.5,0,0)
if event.key == pygame.K_UP:
glTranslatef(0,1,0)
if event.key == pygame.K_DOWN:
glTranslatef(0,-1,0)
glRotatef(1, 5, 1, 1)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
Model()
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
pygame.display.flip()
pygame.time.wait(10)
main()