gpt4 book ai didi

c++ - 使用 glFrustum 创建拼接场景

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:46:11 24 4
gpt4 key购买 nike

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

enter image description here想象一下在三个显示器上呈现的大型真实世界场景。这三个显示器应该显示场景,因为它会根据用户的位置在每个显示器上改变视角。我可以用一个显示器根据用户的位置渲染场景,但无法想到在三个屏幕上工作的方法。

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

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();
}

最佳答案

这并不像看起来那么难。考虑下图(在 znear 级别从上方看的三个屏幕)

Screens from above

我假设每个屏幕在 z 近距离处在 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]

当然,你需要如图所示的屏幕空间中的相机位置。

View 矩阵可以是任意的,但所有三个屏幕都应该相同。这次,将场景空间中的相机位置传递给 gluLookAt

关于c++ - 使用 glFrustum 创建拼接场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17115033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com