我有一个程序,可以根据用户的位置在屏幕上渲染场景。随着用户位置的变化,视锥体会改变以实现非轴投影。我想利用这个技术来在三个不同的显示器上拼接更大的场景,如下所示:
想象一下,在三个显示器上呈现一个大的真实世界场景。每个显示器都应该显示出根据用户位置而改变透视的场景。我已经能够使用一个显示器来根据用户位置渲染场景,但无法想出在三个屏幕上工作的方法。
我创建的非轴投影类基本上执行以下操作:
想象一下,在三个显示器上呈现一个大的真实世界场景。每个显示器都应该显示出根据用户位置而改变透视的场景。我已经能够使用一个显示器来根据用户位置渲染场景,但无法想出在三个屏幕上工作的方法。
我创建的非轴投影类基本上执行以下操作:
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);
}
如何将三个棱锥以这样的方式拼接在一起,使场景看起来像现实中一样连续?目前,此类用户按以下方式绘制场景:
cstCam.project();
//draw something here
popMatriceS(); //which were pushed before glFrustum projection
编辑:
在我的情况下,为了为用户定义三个棱台(考虑到相同参考系中所有显示器的用户和屏幕角),我进行了以下操作:
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();
}
//drawing
camera1.end
。由于它适用于单个显示器,因此可以在本质上将相同的代码用于三个显示器,就像我在编辑中编写的那样。我假设由于它适用于单个显示器,所以当我使用三个显示器时会出现某些错误,但不确定是棱台还是MV矩阵的问题。 - user1240679camera.begin()
函数实际上是通过gluLookAt()
设置模型视图矩阵。它以一种过于复杂的方式进行设置,并且如果我正确地跟踪了代码,则位置设置错误。如果我正确理解了它,只有在指定SetViewPortalWindow
角落的right=-left和top=-bottom时,它才会偶然起作用。 - derhassgluLookAt(_wcUserHead.x, _wcUserHead.y, 0, _wcUserHead.x, _wcUserHead.y, -1)
加入其中,看看是否能得到正确的结果。但是关于用户位置的z缩放呢? 2)关于原始问题:通过创建另一个相机类,在begin方法中不使用gluLookAt
,我将尝试执行camera1.begin(); camera2.begin()
//在此处同时为两个相机执行gluLookcamera1.end(); camera2.end()
,以便为多个显示器生成单个MV矩阵。我希望我理解得正确,但会及时告诉你。 - user1240679