Pygame,OpenGL:将3D rgb值投影到2D su

2024-09-25 14:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Pygame和OpenGL,我在3D中绘制了一个红色和绿色的球体-在z方向上近距离和远距离:

spheres

我想在我的视图的2D平面中检索此图像的rgb值。在下面的代码片段中,我使用Pygame和OpenGL方法标记为12,因为它们只返回黑色像素。你知道吗

import pygame
from pygame.locals import DOUBLEBUF, OPENGL
import OpenGL.GL as GL
import OpenGL.GLU as GLU

x1, y1, z1 = 0, 0, -5
r1 = .2

x2, y2, z2 = 0, 1, -9
r2 = .2

border_x, border_y, border_z = 200, 200, 200
field_of_view_in_deg = 45

aspect_ratio = border_x/border_y
clip_near = .1
clip_far = 200

longitude_parts = 50
latitude_parts = 50

delay = 500

red = (1, 0, 0)
green = (0, 1, 0)

pygame.init()
win = pygame.display.set_mode((border_x, border_y), DOUBLEBUF | OPENGL)
surface = pygame.Surface((border_x, border_y))

GLU.gluPerspective(field_of_view_in_deg, aspect_ratio, clip_near, clip_far)
GL.glEnable(GL.GL_DEPTH_TEST)
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)

GL.glPushMatrix()
GL.glTranslatef(x1, y1, z1)
GL.glColor3fv(red)
GLU.gluSphere(GLU.gluNewQuadric(), r1, longitude_parts, latitude_parts)
GL.glPopMatrix()

GL.glPushMatrix()
GL.glTranslatef(x2, y2, z2)
GL.glColor3fv(green)
GLU.gluSphere(GLU.gluNewQuadric(), r2, longitude_parts, latitude_parts)
GL.glPopMatrix()

# 1
pixels = pygame.PixelArray(surface)

# 2
pixels = GL.glReadPixels(border_x, border_y, border_x, border_y, GL.GL_RGB,
                         GL.GL_INT)

pygame.display.flip()
pygame.time.wait(delay)

我的问题是:

如何从三维投影到定义的二维曲面?我试图在glReadPixels之前插入gluUnproject,但我不完全理解此函数返回的内容,如下所示:

obj_x=0.0414213539903457, obj_y=0.0414213539903457, obj_z=-0.09999999851062896:

modelview_matrix = GL.glGetDoublev(GL.GL_MODELVIEW_MATRIX)
projection_matrix = GL.glGetDoublev(GL.GL_PROJECTION_MATRIX)
viewport = GL.glGetIntegerv(GL.GL_VIEWPORT)
obj_x, obj_y, obj_z = GLU.gluUnProject(border_x, border_y, 0,
                                       modelview_matrix,
                                       projection_matrix,
                                       viewport)

关于2:我如何告诉glReadPixels从定义的曲面读取?你知道吗


Tags: importobjclippygamematrixopenglpartsgl
1条回答
网友
1楼 · 发布于 2024-09-25 14:18:44

^{}的参数指定应该读取的窗口矩形。前两个参数指定从帧缓冲区读取的第一个像素的窗口坐标,第三个和第四个参数指定像素矩形的尺寸(宽度和高度)。你知道吗

读取整个窗口(帧缓冲区)的参数是0, 0, border_x, border_y

pixels = GL.glReadPixels(0, 0, border_x, border_y, GL.GL_RGB, GL.GL_INT)   

注意,可以将颜色值选择为整数值(GL.GL_BYTEGL.GL_INT)或范围为[0.0,1.0](GL.GL_FLOAT)的浮点值。你知道吗

例如,以下代码将打印1.0,因为视图中间红点的红色通道被读取:

pixels = GL.glReadPixels(0, 0, border_x, border_y, GL.GL_RGB, GL.GL_FLOAT)

x, y = 100, 100
r = pixels[x][y][0]
print(r)

相关问题 更多 >