PyOpenGL 如何导入 obj 文件?

2023-12-02

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()

现在我想将场景添加到带有立方体的窗口中或替换它

有人可以告诉我如何实现这一目标吗?

所以我想我必须从场景中添加新的顶点,对吗?

我现在想添加 obj 以学习如何将搅拌机模型导入游戏中


设置关键字参数collect_faces = True,当你读到波前 .obj 文件。这导致为每个网格收集三角形面数据:
(See 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 和 OpenGL 立即模式(旧版 OpenGL)


最小的例子(斯坦福兔子):

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()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PyOpenGL 如何导入 obj 文件? 的相关文章

  • 如何让“conda”安装程序查找“PyPi”包

    我试图使用conda http conda pydata org docs using pkgs html managing packages包管理器来安装我的 Python 包 最近 我遇到了 Anaconda org 存储库中不存在我需
  • 如何同时运行多个功能[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有以下代码 my func1 my func2 my func3 my func4 my func5 是否可以同时计算函数的数据 而
  • 从内存地址创建python对象(使用gi.repository)

    有时我需要调用仅存在于 C 中的 gtk gobject 函数 但返回一个具有 python 包装器的对象 之前我使用过基于 ctypes 的解决方案 效果很好 现在我从 PyGtk import gtk 切换到 GObject intro
  • 使用管理员权限打开cmd(Windows 10)

    我有自己的 python 脚本来管理我的计算机上的 IP 地址 它主要在命令行 Windows 10 中执行netsh命令 您必须具有管理员权限 这是我自己的计算机 我是管理员 运行脚本时我已经使用管理员类型的用户 Adrian 登录 我无
  • Python3将模块从文件夹导入到另一个文件夹

    我的结构字典是 mainFolder folder1 init py file1 py file2 py folder2 init py file3 py file4 py setup py init py 我需要将 file4 py 从f
  • 如何用函数记录一个文件?

    我有一个带有函数 lib py 但没有类的python 文件 每个函数都有以下样式 def fnc1 a b c This fonction does something param a lalala type a str param b
  • 会话数据库表清理

    该表是否需要清除或者由 Django 自动处理 Django 不提供自动清除功能 然而 有一个方便的命令可以帮助您手动完成此操作 Django 文档 清除会话存储 https docs djangoproject com en dev to
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 列表推导式和 for 循环中的 Lambda 表达式[重复]

    这个问题在这里已经有答案了 我想要一个 lambda 列表 作为一些繁重计算的缓存 并注意到这一点 gt gt gt j for j in lambda i for i in range 10 9 9 9 9 9 9 9 9 9 9 Alt
  • 我可以用关闭的文件对象做什么?

    当您打开文件时 它存储在一个打开的文件对象中 该对象使您可以访问该文件的各种方法 例如读取或写入 gt gt gt f open file0 gt gt gt f
  • Pandas 字典键到列[重复]

    这个问题在这里已经有答案了 我有一个像这样的数据框 index column1 e1 u c680 5 u c681 1 u c682 2 u c57 e2 u c680 6 u c681 2 u c682 1 u c57 e3 u c68
  • Eclipse/PyDev 中未使用导入警告,尽管已使用

    我正在我的文件中导入一个绘图包 如下所示 import matplotlib pyplot as plt 稍后我会在我的代码中成功使用此导入 fig plt figure figsize 16 10 然而 Eclipse 告诉我 未使用的导
  • 如何从邻接表高效创建稀疏邻接矩阵?

    我正在与last fm http labrosa ee columbia edu millionsong lastfm数据集来自百万歌曲数据集 http labrosa ee columbia edu millionsong 数据以一组 j
  • 数据损坏 C++ 和 Python 之间的管道

    我正在编写一些代码 从 Python 获取二进制数据 将其通过管道传输到 C 对数据进行一些处理 在本例中计算互信息度量 然后将结果通过管道传输回 Python 在测试时 我发现如果我发送的数据是一组尺寸小于 1500 X 1500 的 2
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 从给定的项目列表创建子列表

    我首先要说的是以下问题不是为了家庭作业目的即使因为我几个月前就完成了软件工程师的工作 无论如何 今天我正在工作 一位朋友向我询问了这个奇怪的排序问题 我有一个包含 1000 行的列表 每行代表一个数字 我想创建 10 个子列表 每个子列表都
  • 如何将两列 pandas Dataframe 移动并堆叠为一列?

    我有一个下面提到的数据框 ETHNIC SEX USUBJID 0 HISPANIC OR LATINO F 16 1 HISPANIC OR LATINO M 8 2 HISPANIC OR LATINO Total 24 3 NOT H
  • Chrome 驱动程序和 Chromium 二进制文件无法在 aws lambda 上运行

    我陷入了一个问题 我需要在 AWS lambda 上做一些抓取工作 所以我按照下面提到的博客及其代码库作为起点 这非常有帮助 并且在运行时环境 Python 3 6 的 AWS lambda 上对我来说工作得很好 https manivan
  • PyObjC + Python 3.0 问题

    默认情况下 Cocoa Python 应用程序使用默认的 Python 运行时版本 2 5 如何配置我的 Xcode 项目以便它使用较新的 Python 3 0 运行时 我尝试用新版本替换项目中包含的Python framework 但它不
  • 从 Django 运行 shell 命令

    我正在 Django 中开发一个网页 使用 apache 服务器 需要调用 shell 命令来启用 禁用一些守护进程 我尝试这样做 os system service httpd restart 1 gt HOME out 2 gt HOM

随机推荐

  • Linux下跨进程共享数据

    在我的应用程序中 我有一个进程分叉一个子进程 例如 child1 并且该子进程在磁盘上写入一个巨大的二进制文件并退出 然后 父进程派生出另一个子进程 child2 该子进程读取这个巨大的文件以进行进一步的处理 文件转储和重新加载使我的应用程
  • ObservableCollection 和 Item PropertyChanged

    我看过很多关于这个问题的讨论 但也许我只是一个新手 无法理解它 如果我有一个可观察的集合 它是 PersonNames 的集合 如 msdn 示例中所示 http msdn microsoft com en us library ms748
  • C 中的波形符运算符

    我见过 ELF 哈希算法中使用的波形符运算符 我很好奇它的作用 代码是来自永远的迷茫 unsigned elf hash void key int len unsigned char p key unsigned h 0 g int i f
  • Python 中对象的布尔值

    众所周知 Python 对对象有布尔值 如果一个类有一个 len 方法 它的每个实例 len 碰巧返回 0 将被评估为布尔值False 例如 空列表 事实上 每个可迭代的空自定义对象都被评估为False如果它出现在布尔表达式中 现在假设我有
  • 基于鼠标的Unity3d瞄准

    我正在制作炮弹射击游戏 这是一个简短的代码 我在其中计算瞄准方向 Vector3 mousePos Input mousePosition mousePos z thisTransform position z camTransform p
  • 为什么在调用 jnz 之前要将一个值与其自身进行“或”操作?

    我正在阅读一些执行以下操作的代码 OR al al JNZ loc 123456 如果我没读错的话 OR命令只是设置一个标志位 然后测试该寄存器是否有任何非零值 为什么要这样写而不是这样写 CMP al 0 JNE loc 123456 哪
  • 在 WooCommerce 中显示产品类别的随机产品缩略图

    我正在尝试提取随机产品缩略图以在我的页面之一上显示为图像 我似乎找不到有效的方法 并尝试了以下解决方案this and this post 在 div 中回显它也是有益的 这是我目前正在尝试的 但我仍然不确定如何做到这一点 函数 php f
  • 使用 C# 从 xml 文件获取值

    我对 xml 很陌生 我不知道如何从下面的 xml 文件中读取 获取值
  • 无法从 Android 设备在 Facebook 页面中看到类似选项

    I am trying to open a facebook page from my app in both android and ios In ios the page shows LIKE button but in android
  • 使用参数化 SqlCommand 是否可以使我的程序免受 SQL 注入的影响?

    我知道SQL注入是相当危险的 现在 在我的 C 代码中 我使用以下命令编写参数化查询SqlCommand class SqlCommand command command CommandText SELECT FROM Jobs WHERE
  • Android 列表视图的 Bubble Chat 问题

    嗨 我遇到了一个奇怪的麻烦 我没有得到气泡 例如你的消息在右边 我的消息在左边 当我调用notifydatachanges时 它会删除所有的气泡 请指导我 下面是代码 private final Handler mHandler new H
  • 如何使用 ASP.Net MVC 路由来路由图像?

    我将网站升级为使用传统 ASP Net Web 表单中的 ASP Net MVC 我使用 MVC 路由将对旧 aspx 页面的请求重定向到新的控制器 操作等效项 routes MapRoute OldPage oldpage aspx ne
  • SwiftUI:访问 macOS 上的特定场景 ViewModel

    在这个简单的示例应用程序中 我有以下要求 有多个窗口 每个窗口都有自己的ViewModel 切换Toggle在一个窗口中应该not更新另一个窗口的 我还希望能够通过菜单切换 就目前而言 前两点是not鉴于 最后一点是有效的 我已经知道当我移
  • django heroku 媒体文件 404 错误

    我最近在 Heroku 上部署了一个 Django 应用程序 并上传了一些媒体文件 一切似乎都工作正常 直到昨天 当我尝试再次访问该应用程序时 发现它给出了 404 错误 有什么想法为什么会发生这种情况吗 设置 py import os B
  • ASP.Net 2012 使用 jQuery 进行非侵入式验证

    我正在使用 Visual Studio 2012 我创建了一个空 ASP Net Web 应用程序 当我尝试添加传统验证器控件到新页面 出现这个错误 WebForms UnobtrusiveValidationMode 需要 jquery
  • oracle sql在计数时不是按表达式分组[重复]

    这个问题在这里已经有答案了 我正在尝试运行以下查询来计算过去 6 个月内转诊患者的医生数量 SELECT count local doc providerno NumberofReferals LOCAL DOC FULLNAME FULL
  • Javascript 世界时区与 GMT 的时差计算器

    我希望有人能告诉我定期更新时区数据库的方向 我找到了一个 但抱歉我不记得它来自哪里 但是随着当前 GMT 时钟变化的快速临近 我担心我的所有数据都会不正确 即从英国到纽约的时差将从落后 5 小时变为 6 小时落后几个小时 任何有关此事的帮助
  • 包含相当于 SQL Server 中的 Like

    当我运行此查询时 Select from Table1 Where Column1 Like aaa 3 Result Select from Table1 Where Column1 Like a 3 Result Select from
  • PowerShell 的 ConvertFrom-SecureString -key 的安全性如何

    我有一个模块 其中包含一些带有一些私有数据的字符串 这些数据应该很难获得 但会经常更改 我需要将此脚本放在各种机器上 这些机器可能会访问它 并且代码可能会被不应该拥有用于导出输出的信息的人读取 我真的很担心不时变化的字符串 因此我正在考虑创
  • PyOpenGL 如何导入 obj 文件?

    import pygame import OpenGL from pygame locals import from OpenGL GL import from OpenGL GLU import import pywavefront sc