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()
//绘图