簡體   English   中英

Pygame、OpenGL:將 3D rgb 值投影到 2D 表面

[英]Pygame, OpenGL: Project 3D rgb values to 2D surface

使用 Pygame 和 OpenGL,我在 3D 中繪制了一個紅色和一個綠色的球體 - 在 z 方向上的近距離和遠距離:

球體

我想在我視圖的 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)

我的問題是:

如何從 3D 投影到定義的 2D 表面? 我試圖在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從定義的表面讀取?

glReadPixels的參數指定應該讀取的窗口矩形。 前兩個參數指定從幀緩沖區讀取的第一個像素的窗口坐標,第三個和第四個參數指定像素矩形的尺寸(寬度和高度)。

讀取整個窗口(framebuffer)的參數是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 )。

eg 下面的代碼會打印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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM