gluLookAt和glFrustum带有移动物体

Cor*_*y D 3 c++ opengl

原始问题/代码

我正在调整3D对象的渲染并尝试使用gluLookAt对象跟随对象,因为对象的中心y位置一旦达到它的最大高度就会不断增加.下面是我设置ModelView和Projection矩阵的代码部分:

float diam = std::max(_framesize, _maxNumRows);
float centerX = _framesize / 2.0f;
float centerY = _maxNumRows / 2.0f + _cameraOffset;
float centerZ = 0.0f;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(centerX - diam,
          centerX + diam,
          centerY - diam,
          centerY + diam,
          diam,
          40 * diam);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0., 0., 2. * diam, centerX, centerY, centerZ, 0, 1.0, 0.0);
Run Code Online (Sandbox Code Playgroud)

目前,该对象显示得非常远,并且似乎进一步移回屏幕(-z)和向下(-y),直到它最终消失.

我究竟做错了什么?如何让我的曲面出现在屏幕中央,占据整个视图,相机随着对象移动而更新?


更新的代码和当前问题

这是我当前的代码,现在将对象置于死角并填满我的窗口.

float diam = std::max(_framesize, _maxNumRows);
float centerX = _framesize / 2.0f;
float centerY = _maxNumRows / 2.0f + _cameraOffset;
float centerZ = 0.0f;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(centerX - diam,
          centerX,
          centerY - diam,
          centerY,
          1.0,
          1.0 +  4 * diam);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(centerX, _cameraOffset, diam, centerX, centerY, centerZ, 0, 1.0, 0.0);
Run Code Online (Sandbox Code Playgroud)

当被查看的对象开始移动时,我仍然有一个问题,它不会完全居中.它似乎几乎抖动一个像素,然后在更新时下降2个像素.最终,对象离开当前视图.我该如何解决这个抖动?

dat*_*olf 5

你的问题在于了解投影的作用.在你的情况下glFrustum.我认为解释glFrustum的最好方法是通过图片(我只是手绘).你开始了一个名为Eye Space的空间.它是由模型视图矩阵转换后顶点所在的空间.需要将此空间转换为称为" 规范化设备坐标"空间的空间.这发生在两个过程中:

  1. 通过投影(矩阵)将眼睛空间转换为剪辑空间
  2. 应用透视除以{X,Y,Z} = {x,y,z}/w,将其带入规范化设备坐标空间.

这种可见效果是OpenGL的"镜头".在下面的图片中,您可以看到眼睛空间中的绿色突出显示区域(技术上是3个体积),即NDC空间反投影到其中.在大写的情况下left = -right,top = -bottom示出了对称平截头体的效果.在下图中left ? -right,top ? -bottom示出了不对称平截头体.

glFrustum的影响

请注意,应用这种不对称性(通过中心偏移)将不会转动,即旋转平截头体,但会使其偏斜.然而,"相机"将保持在原点,仍然指向-Z轴.当然,图像投影的中心会发生变化,但这不是你想要的.

像那样的平截头体偏斜有应用.最重要的是,实现左眼和右眼的不同视图和立体渲染设置是正确的方法.