我有一个程序,可读取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()的行为不正确,我想念的是什么?
修改视锥和相机。
您需要两个不同的相机矩阵来模拟眼睛分离,并需要使用略微不同的平截头体来消除脚趾进入。
/* 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] 删除。
我来说两句