使用glFrustum在不使用GLUT_STEREO的情况下渲染两个重叠的FOV

Jary316

我有一个程序,可读取360度单声道全景图并读取IMU,并根据头部位置绘制全景图的正确部分。

我正在创建两个窗口,每个显示一个,并且不想依赖GLUT_STEREO。因此,每个显示的draw()调用都是独立的,但现在它们呈现的是同一事物,这是一个gluSphere来表示全景。为了绘制球体的正确部分,IMU数据(四元数)成为旋转矩阵,并将该矩阵与投影相乘。

我希望与这两个图像有点重叠,如下图所示: 重叠的

例如,红色矩形是我的左侧显示,蓝色矩形是我的右侧显示,但中间有些重叠。

我正在阅读一些有关立体渲染的文章,并且我认为解决方案是替换从gluPerspective()到glFrustum()的调用,并简单地同时修改left和right参数。我以为在显示屏上向glFrustum()的left / right参数减去一些值,然后向glFrustum()的left / right参数添加一些值就可以解决问题。我修改了glutReshapeFunc()回调的投影矩阵来做到这一点:

void resize(int width, int height)
{
  glViewport(0, 0, width, height);

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  GLdouble near = 0.1;
  GLdouble far = 100.0;

  GLdouble aspect = (double) width / (double) height;
  GLdouble top = tan(FOVY / 360 * M_PI) * near;
  GLdouble bottom = -top;
  GLdouble right = top * aspect;
  GLdouble left = -right;

  // TODO: Canned value for testing
  left += 0.5;
  right += 0.5;

  glFrustum(left, right, bottom, top, near, far);
  //  gluPerspective(FOVY, aspect, near, far);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

不幸的是,这并没有达到我的期望(我真的不确定为什么)。我认为修改glFrustum()的left和right参数将保持相同的水平FOV,但将其向左或向右移动。它似乎可以将图像拉伸或拉伸。

我曾在ModelView或glLookAt()上玩过glTranslatef(),但是那里对我来说还不清楚。为什么glFrustum()的行为不正确,我想念的是什么?

Genpfault

修改视锥相机。

您需要两个不同的相机矩阵来模拟眼睛分离,并需要使用略微不同的平截头体来消除脚趾进入。

使用OpenGL(和GLUT)进行3D立体渲染

/* Misc stuff */
ratio  = camera.screenwidth / (double)camera.screenheight;
radians = DTOR * camera.aperture / 2;
wd2     = near * tan(radians);
ndfl    = near / camera.focallength;

/* Derive the two eye positions */
CROSSPROD(camera.vd,camera.vu,r);
Normalise(&r);
r.x *= camera.eyesep / 2.0;
r.y *= camera.eyesep / 2.0;
r.z *= camera.eyesep / 2.0;

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
left  = - ratio * wd2 - 0.5 * camera.eyesep * ndfl;
right =   ratio * wd2 - 0.5 * camera.eyesep * ndfl;
top    =   wd2;
bottom = - wd2;
glFrustum(left,right,bottom,top,near,far);

glMatrixMode(GL_MODELVIEW);
glDrawBuffer(GL_BACK_RIGHT);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(camera.vp.x + r.x,camera.vp.y + r.y,camera.vp.z + r.z,
          camera.vp.x + r.x + camera.vd.x,
          camera.vp.y + r.y + camera.vd.y,
          camera.vp.z + r.z + camera.vd.z,
          camera.vu.x,camera.vu.y,camera.vu.z);
MakeLighting();
MakeGeometry();

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
left  = - ratio * wd2 + 0.5 * camera.eyesep * ndfl;
right =   ratio * wd2 + 0.5 * camera.eyesep * ndfl;
top    =   wd2;
bottom = - wd2;
glFrustum(left,right,bottom,top,near,far);

glMatrixMode(GL_MODELVIEW);
glDrawBuffer(GL_BACK_LEFT);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(camera.vp.x - r.x,camera.vp.y - r.y,camera.vp.z - r.z,
          camera.vp.x - r.x + camera.vd.x,
          camera.vp.y - r.y + camera.vd.y,
          camera.vp.z - r.z + camera.vd.z,
          camera.vu.x,camera.vu.y,camera.vu.z);
MakeLighting();
MakeGeometry();

glutSwapBuffers();

glDrawBuffer()用适当的FBO绑定替换呼叫。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不使用嵌套for循环的情况下将两个列表合并到字典中

是否可以在不使用返回类型的情况下连接两个int数组?

在不使用+或任何算术运算符的情况下将两个数字相加

如何在不使用嵌套的for循环的情况下迭代两个列表?

我可以在不使用两个循环的情况下执行此任务吗?

在不使用atom_concat的情况下连接两个序言原子

在不使用if else的情况下获取两个日期中的较晚日期

在不使用递归的情况下将FFT应用于两个非常大的数字的乘法

Flutter-如何在不使用命名路由的情况下弹出两个屏幕?

如何在不使用for循环的情况下向量化这两个numpy操作?

在不使用foreach循环的情况下搜索比较两个键的多维数组

在不使用python中的库的情况下,将两个不同大小的元素明智的列表相乘

如何在不使用zip的情况下遍历两个列表?

如何在不使用第三个变量的情况下交换两个Perl变量?

如何在不使用乘法运算符的情况下使两个正数相乘的递归函数

在不使用基于级联键的联接的情况下,在Power Pivot中合并来自两个单独表的数据

在不使用软件包的情况下,如何计算python中两个日期之间的年,月,日数

如何在不使用循环目标c的情况下比较两个动态数组

如何在不使用临时变量的情况下交换两个变量的值?

在不使用任何BackColor属性的情况下,ToolTip的BackColor随两个不同的示例而变化

在不使用 css 属性 float 的情况下使两个元素表现得像浮动元素

如何在不使用 zip/map 的情况下将两个列表合并为列表列表

在不使用熊猫的情况下合并和删除两个 csv 中的重复项

在不使用内部查询的情况下从两个不同的表和组计算计数和总和

如何在不使用索引的情况下连接不同列上的两个数据框

在不使用网格的情况下重叠css中的元素

如何在 Python 中不使用 numpy 的情况下将两个稀疏矩阵相乘?

在不使用任何比较的情况下比较两个整数(递归,python)

如何在不使用for循环的情况下对两个列表的多个元素进行处理?