[英]Drawing a background image beind 3d model in opengl
我想通過這個腳本繪制 3d 模型 (.obj)
https://github.com/yarolig/OBJFileLoader/blob/master/OBJFileLoader/objloader.py
作為 bacgrund,我想從網絡攝像頭繪制視頻。但是當我繪制圖像和 3d 模型時,只顯示圖像。
這是我的圖像加載器類
class ImageLoader:
def __init__(self, x, y):
self.x = x
self.y = y
self.width = 0
self.height = 0
self.img_data = 0
def load(self, image):
im = image
tx_image = cv2.flip(im, 0)
tx_image = Image.fromarray(tx_image)
self.width = tx_image.size[0]
self.height = tx_image.size[1]
self.img_data = tx_image.tobytes('raw', 'BGRX', 0, -1)
self.Texture = glGenTextures(1)
glBindTexture(GL_TEXTURE_2D, self.Texture)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.width, self.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, self.img_data)
def draw(self):
glEnable(GL_TEXTURE_2D)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslate(self.x, self.y, 0)
glBegin(GL_QUADS)
glVertex(0, 0, 0)
glTexCoord2f(0, 0)
glVertex(self.width, 0, 0)
glTexCoord2f(0, 1)
glVertex(self.width, self.height, 0)
glTexCoord2f(1, 1)
glVertex(0, self.height, 0)
glTexCoord2f(1, 0)
glEnd()
glDisable(GL_TEXTURE_2D)
glFlush()
在這里運行代碼。
if __name__ == '__main__':
cap = cv2.VideoCapture(0)
width = int(cap.get(3))
height = int(cap.get(4))
pygame.init()
pygame.display.set_mode((width, height), pygame.DOUBLEBUF | pygame.OPENGL)
box = OBJ('3dglasses/oculos.obj', ) # from OBJFileLoader import OBJ
gluPerspective(45, (width / height), 0.1, 50.0)
glTranslate(0.0, 0.0, -5)
glRotate(0, 0, 0, 0)
if True:
glClearColor(0.7, 0, 0, 1)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(0, width, height, 0)
im_loader = ImageLoader(0, 0)
while True:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
quit()
success, image = cap.read()
im_loader.load(image)
im_loader.draw()
box.render()
pygame.display.flip()
圖像和模型使用不同的投影和模型視圖矩陣。 因此,您需要在繪制對象之前設置矩陣。
模型沒有被繪制,因為它沒有通過深度測試。 繪制圖像時禁用深度測試。 如果禁用深度測試,則不會向深度緩沖區寫入任何內容。
if __name__ == '__main__':
cap = cv2.VideoCapture(0)
width, height = int(cap.get(3)), int(cap.get(4))
pygame.init()
pygame.display.set_mode((width, height), pygame.DOUBLEBUF | pygame.OPENGL)
box = OBJ('3dglasses/oculos.obj', ) # from OBJFileLoader import OBJ
im_loader = ImageLoader(0, 0)
angle = 0
glClearColor(0.7, 0, 0, 1)
run = True
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluOrtho2D(0, width, height, 0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glDisable(GL_DEPTH_TEST)
success, image = cap.read()
if success:
im_loader.load(image)
glColor3f(1, 1, 1)
im_loader.draw()
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45, (width / height), 0.1, 50.0)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslate(0.0, 0.0, -5)
glRotate(angle, 0, 1, 0)
angle += 1
glEnable(GL_DEPTH_TEST)
box.render()
pygame.display.flip()
pygame.quit()
quit()
當前紋理坐標,在調用glVertex
時與頂點相關聯。 因此,在指定頂點坐標之前需要指定紋理坐標:
class ImageLoader:
# [...]
def draw(self):
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslate(self.x, self.y, 0)
glEnable(GL_TEXTURE_2D)
glBegin(GL_QUADS)
glTexCoord2f(0, 0)
glVertex2f(0, 0)
glTexCoord2f(1, 0)
glVertex2f(self.width, 0)
glTexCoord2f(1, 1)
glVertex2f(self.width, self.height)
glTexCoord2f(0, 1)
glVertex2f(0, self.height)
glEnd()
glDisable(GL_TEXTURE_2D)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.