gpt4 book ai didi

python - PyOpenGL,使用 glFrustum 和 glTranslate 在屏幕上出现 3D 图形问题

转载 作者:行者123 更新时间:2023-12-02 17:52:39 27 4
gpt4 key购买 nike

概述:

我正在尝试创建一个类似于此的 3D 应用程序:

www.youtube.com/watch?v=h9kPI7_vhAU. 

我正在使用 OpenCV2.2、Python2.7 和 pyOpenGL。
这可以通过 this background maths and code snippet 来实现其中 x, y, z 是观看者眼睛的位置(从网络摄像头抓取!)

问题:

当我这样做时,我渲染的对象(一个立方体)会沿着 z 轴(进入屏幕)拉伸(stretch),我不太清楚为什么。它被比作从上方俯视一座非常高的摩天大楼(而不是立方体)。随着眼睛 z 位置的变化,立方体的位置在 z 方向上的变化非常迅速。 This结果是一帧,它被拉长了!

代码(带有bigD的编辑):
def DrawGLScene():
#get some parameters for calculating the FRUSTUM
NEAR_CLIPPING_PLANE = 0.01
FAR_CLIPPING_PLANE = 2
window = glGetIntegerv(GL_VIEWPORT)
WINDOW_WIDTH = window[2]
WINDOW_HEIGHT= window[3]

#do facial detection and get eye co-ordinates
eye = getEye()

#clear window
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

#before any projection transformation command comes these 2 lines:
glMatrixMode(GL_PROJECTION)
glLoadIdentity()

#transform projection to that of our eye
glFrustum(NEAR_CLIPPING_PLANE*(-WINDOW_WIDTH /2 - eye[0])/eye[2],
NEAR_CLIPPING_PLANE*( WINDOW_WIDTH /2 - eye[0])/eye[2],
NEAR_CLIPPING_PLANE*(-WINDOW_HEIGHT/2 - eye[1])/eye[2],
NEAR_CLIPPING_PLANE*( WINDOW_HEIGHT/2 - eye[1])/eye[2],
NEAR_CLIPPING_PLANE, FAR_CLIPPING_PLANE)

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glTranslatef(-eye[0],-eye[1],-eye[2])

drawCube()

glutSwapBuffers()

getEye() 返回的数据示例如下:

[0.25,0.37,1] 如果观众的脸靠近屏幕左下角并且距离 1m

[-0.5,-0.1,0.5] 如果观看者的脸靠近屏幕右上角且距离 0.5m

绘制时立方体的高度、宽度、深度为 2,其中心位于 (0,0,0)。

如果有人想做类似的项目并想要启动或认为问题出在所提供的代码之外的其他地方,我将提供完整的代码。

最佳答案

你得到奇怪结果的原因是因为:

glTranslatef(-eye[0],-eye[1],-eye[2])

这个电话应该在
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()

因为投影矩阵与您的 glFrustum 调用一样已准备好,因此如果您将其乘以一个平移矩阵,它将不再使其成为透视投影矩阵。模型 View 矩阵必须描述所有世界和相机转换。

还要记住,如果您对模型 View 矩阵所做的唯一转换是平移,那么您将始终盯着负 Z 轴。

关于python - PyOpenGL,使用 glFrustum 和 glTranslate 在屏幕上出现 3D 图形问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16435935/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com