0

概述:

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

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

我正在使用 OpenCV2.2、Python2.7 和 pyOpenGL。这可以通过这个背景数学和代码片段来实现,其中 x、y、z 是观众眼睛的位置(从网络摄像头抓取!)

问题:

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

代码(带有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)。

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

4

1 回答 1

1

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

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

这个电话应该在

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()

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

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

于 2013-05-08T09:58:22.660 回答