标签: pyopengl

Pygame - 第一人称射手用鼠标"看"

我不是在写游戏,而是使用Pygame进行科学渲染.我希望控件能够像第一人称射击游戏一样工作,这样用户就可以使用熟悉的控件进行导航.

我试图编写代码,使其具有与"天际"或"半条命"中的"外观"功能相同的属性,但鼠标不会移动光标 - 它可以让您以无限的圆圈环顾四周.单击应该没有效果.

控件的第一次尝试:

(游戏循环中的代码)

delta_y, delta_x = pygame.mouse.get_rel()
rotation_direction.x = float(delta_x)
rotation_direction.y = float(delta_y)
Run Code Online (Sandbox Code Playgroud)

(不要问我为什么,但是y和x需要像这样反转以获得预期的外观方向;必须与相机变换实现有关,这不是我的.)

然而,这导致光标位于窗口顶部,当光标到达屏幕边缘时,窗口停止旋转; 即代码报告屏幕上的实际位置.

我尝试在每个游戏循环中"重置"鼠标位置(顺便提一下,隐藏鼠标):

pygame.mouse.set_pos([150, 150])
pygame.mouse.set_visible(False)
Run Code Online (Sandbox Code Playgroud)

但是这会在下一个循环中产生对称的"向后移动"三角形,这意味着你无法在任何地方'看'.

总结一下,我想:

  • 检测从设备报告的实际鼠标移动
  • 不移动/显示任何操作系统光标
  • 不要夹在屏幕的边缘

使用Pygame或其他Python黑客攻击的最佳方法是什么?

python mouse pygame pyopengl

6
推荐指数
1
解决办法
3485
查看次数

OpenGL 中的透明 FrameBuffer 背景

我想使用 glClear 和 glClearColor 用包括 alpha 透明度的颜色填充帧缓冲区。然而,当绑定到渲染到屏幕的纹理时,帧缓冲区总是渲染为不透明的。

我希望渲染到帧缓冲区的所有内容都保持其透明度。我只是想改变背景。

请参阅以下代码:

def create_texture(surface):
surface.texture = glGenTextures(1)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity() #Loads model matrix
glBindTexture(GL_TEXTURE_2D, surface.texture) #Binds the current 2D texture to the texture to be drawn
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) #Required to be set for maping the pixel data
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) #Similar as above
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, surface.surface_size[0], surface.surface_size[1], 0, GL_RGBA,GL_UNSIGNED_BYTE, surface.data) #Put surface pixel data into texture
if surface.data == None:
    setup_framebuffer(surface)
    c = [float(sc)/255.0 for sc in surface.colour] #Divide colours by 255 …
Run Code Online (Sandbox Code Playgroud)

python opengl alphablending framebuffer pyopengl

5
推荐指数
1
解决办法
5054
查看次数

使用 PyOpenGL 可视化 3D NumPy 数组

我想创建一个 PyOpenGL/QtOpenGL 小部件,它将允许我可视化任意 NumPy 3D 矩阵,与以下 Hinton 图设想为“立方体”而不是“正方形”不同:

不过,我在使用 OpenGL 时遇到了一些困难。到目前为止,这是我的代码:

from OpenGL.GL import *
from OpenGL.GLUT import *
from PyQt4 import QtGui, QtOpenGL
import numpy as np

action_keymap = {
  # 'a': lambda: glTranslate(-1, 0, 0),
  # 'd': lambda: glTranslate( 1, 0, 0),
  # 'w': lambda: glTranslate( 0, 1, 0),
  # 's': lambda: glTranslate( 0,-1, 0),

  'a': lambda: glRotate(-5, 0, 1, 0),
  'd': lambda: glRotate( 5, 0, 1, 0),
  # 'W': lambda: glRotate(-5, 1, 0, 0),
  # 'S': lambda: …
Run Code Online (Sandbox Code Playgroud)

python opengl numpy glsl pyopengl

5
推荐指数
2
解决办法
4329
查看次数

如何在 python 中加载 *.obj 文件并对其应用纹理

标题是我的问题:如何在 Python 中加载 *.obj 3d 模型并对其应用纹理。我设法加载了一个 3d 模型,查看它并将纹理应用于简单的块和墙壁,但似乎不可能将纹理应用于 3d 模型。我怎样才能做到这一点?是否有脚本可以在 Python 中加载带有纹理的 3d 模型。

我使用 PyOpenGL 作为平台,但不允许我使用老师的 pygame。

python opengl 3d pyopengl

5
推荐指数
0
解决办法
1万
查看次数

PyQt5 应用程序中的极简 PyOpenGL 示例

我正在学习PyOpenGL并在PyQt5应用程序中使用它。我正在尝试将一些旧的简单示例从C++/ 转换QtPython. 以下示例应在黑色背景上绘制白色三角形。至少它在相应的C++/Qt代码中。但它什么也不做,只是一个黑色的窗口。任何想法我缺少什么?请注意,我需要使用着色器的“现代”方法(但是根据我的知识 - 我可能是错的 - 以下代码应该只使用默认的普通着色器,即 2D 中的白色)而不是所有那些旧的glBegin(), glEnd().

import numpy as np
from OpenGL import GL
from PyQt5.QtWidgets import QOpenGLWidget, QApplication


class OpenGLWidget(QOpenGLWidget):

    def initializeGL(self):
        vertices = np.array([0.0, 1.0, -1.0, -1.0, 1.0, -1.0], dtype=np.float32)

        bufferId = GL.glGenBuffers(1)
        GL.glBindBuffer(GL.GL_ARRAY_BUFFER, bufferId)
        GL.glBufferData(GL.GL_ARRAY_BUFFER, vertices.size, vertices, GL.GL_STATIC_DRAW)

        GL.glEnableVertexAttribArray(0)
        GL.glVertexAttribPointer(0, 2, GL.GL_FLOAT, GL.GL_FALSE, 0, 0)

    def paintGL(self):
        GL.glDrawArrays(GL.GL_TRIANGLES, 0, 3)


app = QApplication([])
widget = OpenGLWidget() …
Run Code Online (Sandbox Code Playgroud)

python pyqt pyopengl pyside

5
推荐指数
1
解决办法
2598
查看次数

如何在 PyOpenGL 中将 png 图像作为图像叠加层进行 blit?

我正在 PyOpenGL 中制作游戏,并希望将一些图像作为一些叠加(例如,暂停按钮)显示在屏幕上。我怎样才能做到这一点?

我试过使用glBitmap(),但它不起作用。

这就是我所拥有的:

pauseimg = pygame.image.load(path + "pause.png").convert_alpha()
def blit_image(x,y,w,h,img,r,g,b):
    glColor3f(r,g,b)
    glWindowPos2f(x,y)
    glBitmap(w,h,0,0,0,0,img)
blit_image(300,300,313,115,pauseimg,1,1,1)
Run Code Online (Sandbox Code Playgroud)

我预计它会 blit 图像,但它抛出了一个异常:

Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenGL/latebind.py", line 41, in __call__
    return self._finalCall( *args, **named )
TypeError: 'NoneType' object is not callable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".py", line 438, in <module>
    blit_image(300,300,313,115,pauseimg,1,1,1)
  File ".py", line 135, in blit_image
    glBitmap(w,h,0,0,0,0,img)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/OpenGL/latebind.py", line 45, in __call__
    return self._finalCall( *args, …
Run Code Online (Sandbox Code Playgroud)

python opengl pygame pyopengl opengl-compat

5
推荐指数
1
解决办法
1115
查看次数

PyOpenGL 如何导入 obj 文件?

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 …
Run Code Online (Sandbox Code Playgroud)

python opengl pyopengl wavefront blender

5
推荐指数
1
解决办法
2万
查看次数

OpenGL 中的纹理数组

我正在开发一个项目,我需要使用纹理数组来应用纹理。我问了很多关于这个的问题,但没有一个得到我完全满意的答案(访问更高版本的 GLSLOpenGL:在 GLSL 中访问数组纹理OpenGL:如何实现纹理数组?)所以我我正在问一个更广泛的问题,希望得到答复。无论如何,我将如何在 OpenGL 中对对象进行纹理处理(更具体地说是 PyOpenGL,但如果你将答案放在 C++ 中,那就没问题了)。我已经有一种加载纹理数组的方法,只是没有应用它的方法。这是期望的结果:

例子

图片来自opengl-tutorial

这就是我目前用于加载数组纹理的内容:

def load_texture_array(path,width,height):
    teximg = pygame.image.load(path)
    texels = teximg.get_buffer().raw
    texture = GLuint(0)

    layerCount = 6
    mipLevelCount = 1

    glGenTextures(1, texture)
    glBindTexture(GL_TEXTURE_2D_ARRAY, texture)
    glTexStorage3D(GL_TEXTURE_2D_ARRAY, mipLevelCount, GL_RGBA8, width, height, layerCount)
    glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, width, height, layerCount, GL_RGBA, GL_UNSIGNED_BYTE, texels)

    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
    glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
Run Code Online (Sandbox Code Playgroud)

TLDR:如何使用纹理数组将纹理应用于 OpenGL 中的对象?

如有必要,我很乐意提供任何其他信息。

python opengl textures pygame pyopengl

5
推荐指数
1
解决办法
6066
查看次数

如何使用 pygame 进行绘图,同时使用 pyopengl 进行绘图?

我有一个用 python 编写的程序,并使用 pygame 和 pyopengl。唯一的问题是,我无法使用 pygame.draw 在屏幕上绘制任何内容,而这正是我将用于与程序交互的东西。我想知道是否有一种方法可以使用 pygame 的系统进行绘图,同时也可以在其后面使用 pyopengl 进行 3D 绘图。

python opengl pygame pyopengl

5
推荐指数
1
解决办法
953
查看次数

PyOpenGL 和 Pygame 的内存泄漏

也许有人启发我。我得到了这段代码:

import pygame
from OpenGL.GL import glClear, GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_STENCIL_BUFFER_BIT
from pygame.constants import DOUBLEBUF, OPENGL

pygame.init()
clock = pygame.time.Clock()
pygame.display.set_mode((640,480), DOUBLEBUF|OPENGL)

    
while 1:
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT)


    pygame.display.flip()
    clock.tick(50)
Run Code Online (Sandbox Code Playgroud)

当我使用进程管理器检查它时,运行它会导致缓慢但烦人的内存消耗。为什么会发生这种情况?并没有真正创建任何新对象...只是清除 GL 缓冲区并翻转窗口缓冲区。我将范围缩小到pygame.display.flip()打电话,但对此无能为力。

python opengl memory-leaks pygame pyopengl

5
推荐指数
0
解决办法
83
查看次数