【发布时间】:2013-05-08 08:27:32
【问题描述】:
概述:
我正在尝试创建一个类似于此的 3D 应用程序:
www.youtube.com/watch?v=h9kPI7_vhAU.
我正在使用 OpenCV2.2、Python2.7 和 pyOpenGL。 这可以通过this background maths and code snippet 实现,其中 x、y、z 是观看者眼睛的位置(从网络摄像头抓取!)
问题:
当我这样做时,我渲染的对象(一个立方体)会沿着 z 轴(进入屏幕)拉伸,我不太清楚为什么。它被比作从上方俯视一座非常高的摩天大楼(而不是立方体)。随着眼睛 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)。
如果有人想要做一个类似的项目并想要启动或认为问题出在所提供的代码之外的其他地方,我将提供完整的代码。
【问题讨论】:
标签: python opengl opencv 3d projection