Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/175.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
C++ 使用glFrustum创建缝合的场景_C++_Algorithm_Opengl_Graphics_3d - Fatal编程技术网

C++ 使用glFrustum创建缝合的场景

C++ 使用glFrustum创建缝合的场景,c++,algorithm,opengl,graphics,3d,C++,Algorithm,Opengl,Graphics,3d,我有一个程序,可以根据用户的位置在屏幕上进行场景渲染。当用户改变位置时,平截头体会发生变化以提供离轴投影。我想利用这项技术在三个不同的显示器上工作,将一个更大的场景拼接在一起,使用以下类型的内容: 想象一下,在三个显示器上渲染一个大的真实场景。这三个显示器应显示场景的外观,并根据用户的位置改变每个显示器上的透视图。我可以用一个显示器按照用户的位置渲染场景,但想不出在三个屏幕上工作的方法 我创建的类离轴投影基本上执行以下操作: customCam::project(){ pushMatrices

我有一个程序,可以根据用户的位置在屏幕上进行场景渲染。当用户改变位置时,平截头体会发生变化以提供离轴投影。我想利用这项技术在三个不同的显示器上工作,将一个更大的场景拼接在一起,使用以下类型的内容:

想象一下,在三个显示器上渲染一个大的真实场景。这三个显示器应显示场景的外观,并根据用户的位置改变每个显示器上的透视图。我可以用一个显示器按照用户的位置渲染场景,但想不出在三个屏幕上工作的方法

我创建的类离轴投影基本上执行以下操作:

customCam::project(){
pushMatrices();
glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
        glFrustum(leftNear.x, rightNear.x, bottomNear.y, topNear.y, _near, _far);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(uPos.x, uPos.y, 0, uPos.x, uPos.y, -1, 0, 1, 0); //neglect z scaling for now. In the main program, it's there
    glTranslatef(0, 0, uPos.z);
}
custCam1.project();
//draw scene here. eg: two walls at the far left and right screen
drawWalls();
popMatrices();
custCam2.project();
drawWalls();
popMatrices();
custCam3.project();
drawWalls();
popMatrices();

void drawWalls(){
//Left most corner screen wall
glBegin(GL_QUADS);
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, -50);
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, -50);
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, 0);
glEnd();

//Right most corner screen wall
glBegin(GL_QUADS);
glVertex3f(1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen
glVertex3f(1.5*PHWIDTH, HEIGHT/2, -50);
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, -50);
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, 0);
glEnd();
}
我如何粘贴三个平截头体,使场景看起来像现实世界中一样连续?当前,该类的用户绘制场景,如下所示:

cstCam.project();
    //draw something here
popMatriceS(); //which were pushed before glFrustum projection
编辑: 在我的例子中,要为一个用户定义三个平截头体(考虑同一参照系中所有显示的AccuTn用户和屏幕角),我执行了以下操作:

customCam::project(){
pushMatrices();
glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
        glFrustum(leftNear.x, rightNear.x, bottomNear.y, topNear.y, _near, _far);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(uPos.x, uPos.y, 0, uPos.x, uPos.y, -1, 0, 1, 0); //neglect z scaling for now. In the main program, it's there
    glTranslatef(0, 0, uPos.z);
}
custCam1.project();
//draw scene here. eg: two walls at the far left and right screen
drawWalls();
popMatrices();
custCam2.project();
drawWalls();
popMatrices();
custCam3.project();
drawWalls();
popMatrices();

void drawWalls(){
//Left most corner screen wall
glBegin(GL_QUADS);
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, -50);
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, -50);
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, 0);
glEnd();

//Right most corner screen wall
glBegin(GL_QUADS);
glVertex3f(1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen
glVertex3f(1.5*PHWIDTH, HEIGHT/2, -50);
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, -50);
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, 0);
glEnd();
}

这并不像看上去那么困难。考虑下面的图像(从ZONE级别看上面的三个屏幕)

我假设每个屏幕在x方向上的距离为2个单位。您可能必须根据场景缩放此值

三个屏幕的y坐标范围不会改变,因为它们处于相同的垂直位置

因此,屏幕需要三种不同的投影矩阵。确定偏移量非常简单。您只需要与摄影机点的差异:

left screen   => [-3 - camera.x, -1 - camera.x]
center screen => [-1 - camera.x, 1 - camera.x]
right screen  => [1 - camera.x, 3 - camera.x]
当然,您需要屏幕空间中的摄像头位置,如图所示


视图矩阵可以是任意矩阵,但对于所有三个屏幕都应相同。这一次,将摄影机在场景空间中的位置传递到
gluLookAt

我编辑了我的帖子,为我能够实现的目标添加了更多细节。我基本上能够找到屏幕所有角落相对于用户位置的偏移量,然后使用我的
cstCam::project
函数为这三个屏幕定义了三个不同的投影矩阵。使用我在上面的编辑中发布的代码,我尝试在我的屏幕(三个不同的视口)上模拟相同的结果:1)用户位于三个屏幕的中心,2)用户向右移动:在您将看到的第二个屏幕截图中,当用户向右移动时,第一个摄影机的墙开始显示在第二个屏幕中,它不会形成连续的场景。然而,我不确定的是,这是否与视图矩阵在这三个场景中与我上面所做的相同有关?此外,如果是这样的话,我无法理解为什么所有三个模型都只有一个modelview矩阵。如果能从你这边读到同样的解释就太好了。应该只有一个(模型)视图矩阵,因为只有一个视图,所以三种情况下的视点都是相同的。每个显示器的查看方向也相同(垂直于显示平面,所以只需在每个屏幕上定义一个不对称的平截头体就可以了。您的屏幕截图表明您做得不对…@derhass:对于单显示器,非对称平截头体和投影看起来是正确的。我在这里使用的代码是
begin
end
是使用相机的方法,我使用相机作为投影
camera1.begin()
//绘图
。由于它适用于单个显示器,因此在编辑中为其编写代码时,相同的代码本质上可以用于三个显示器。我假设,由于它适用于单个显示器,因此使用三个显示器时会出现一些错误,但不确定它是平截头体还是MV矩阵?@user1240679:好吧,只需显示您正在使用的真实代码,特别是各种参数的值。很难仅从这些代码片段猜出发生了什么。