概述:
我正在尝试创建一个类似于此的 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)。
如果有人想做类似的项目并想要启动或认为问题出在所提供的代码之外的其他地方,我将提供完整的代码。