Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在OpenGL中进行透视变换?_Opengl_Glut - Fatal编程技术网

如何在OpenGL中进行透视变换?

如何在OpenGL中进行透视变换?,opengl,glut,Opengl,Glut,如果我有像这样的通用透视变换矩阵 / focus 0 cx \ | 0 focus cy | \ 0 0 1 / /焦点0 cx\ |0焦点cy| \ 0 0 1 / 如何设置glFrustum或GLUPPERSECTION的参数以获得正确的变换 例如: glFrustum(-cx,屏幕宽度-cx,-cy,屏幕高度-cy,焦距,焦距+1000) gluLookAt(0.0,0.0,-焦点,0.0,0.0,0.0,0.0,1.0,

如果我有像这样的通用透视变换矩阵

/ focus 0 cx \ | 0 focus cy | \ 0 0 1 / /焦点0 cx\ |0焦点cy| \ 0 0 1 / 如何设置glFrustum或GLUPPERSECTION的参数以获得正确的变换

例如:

glFrustum(-cx,屏幕宽度-cx,-cy,屏幕高度-cy,焦距,焦距+1000) gluLookAt(0.0,0.0,-焦点,0.0,0.0,0.0,0.0,1.0,0.0); 不要创建正确的转换=(

但是给定的矩阵不是openGL所期望的4D变换矩阵;您应该检查一下

您正在将近剪裁平面设置为“焦点”,因此任何闭合的对象都将被剪裁!您应该选择一个更合适的值,如1.0。焦点+1000是有意义的,尽管我做到了!!!=)也许有人认为它会有用

glFrustum( -znear*cx / fx, znear*(w - cx) / fx, -znear*cy / fy, znear*(h - cy) / fy, znear, zfar); glFrustum(-znear*cx/fx,znear*(w-cx)/fx, -znear*cy/fy,znear*(h-cy)/fy, znear,zfar);
你能解释一下你所说的“普通透视变换矩阵”吗?与斜透视相反,我假设矩阵列在下面P=((焦点,0cx),(0,焦点,cy),(0,0,1))其中透视变换写为:(x,y,1)=PRT(x,y,Z,1)。我将尝试重新表述这个问题。如果我知道相机的焦距和主点的坐标(主光轴(Z)和投影平面的交点)。我应该如何调用glFrustum方法来执行这是完全等效的转换?!我看不到任何人格扭曲。。。投影线看起来像perallel=(我应该在哪里设置摄影机主点(cx,cy)?您应该使用gluPerspective而不是glFrustum,这样设置会更简单。您称之为“摄影机主点”是什么?在openGL中,摄影机始终位于(0,0,0),指向-Z(在世界空间中)。
glMatrixMode(GL_PROJECTION)
glFrustum ( 0, screenWidth ,0, screenHeight, focus, focus + 1000)
glMatrixMode(GL_MODELVIEW)
glLookAt(...)
glFrustum( -znear*cx / fx, znear*(w - cx) / fx, -znear*cy / fy, znear*(h - cy) / fy, znear, zfar);