原始问题/代码
我正在调整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个像素.最终,对象离开当前视图.我该如何解决这个抖动?
你的问题在于了解投影的作用.在你的情况下glFrustum.我认为解释glFrustum的最好方法是通过图片(我只是手绘).你开始了一个名为Eye Space的空间.它是由模型视图矩阵转换后顶点所在的空间.需要将此空间转换为称为" 规范化设备坐标"空间的空间.这发生在两个过程中:
这种可见效果是OpenGL的"镜头".在下面的图片中,您可以看到眼睛空间中的绿色突出显示区域(技术上是3个体积),即NDC空间反投影到其中.在大写的情况下left = -right
,top = -bottom
示出了对称平截头体的效果.在下图中left ? -right
,top ? -bottom
示出了不对称平截头体.
请注意,应用这种不对称性(通过中心偏移)将不会转动,即旋转平截头体,但会使其偏斜.然而,"相机"将保持在原点,仍然指向-Z轴.当然,图像投影的中心会发生变化,但这不是你想要的.
像那样的平截头体偏斜有应用.最重要的是,实现左眼和右眼的不同视图和立体渲染设置是正确的方法.