gluLookAt与glFrustum一起扭曲渲染吗?

Ren*_*ger 2 opengl perspectivecamera perspective

我想知道是否gluLookAtglFrustum扭曲渲染图片一起.

这是渲染场景的方式:

在此输入图像描述

这是渲染它的代码.

InitCamera被称为一次,应该,正如我现在所理解的那样,设置一个矩阵,就好像我从原点前面的2个单位和原点前面的3个单位看.也glFrustum用于创建透视图.

void InitCamera() {

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();

  gluLookAt (
    0,  2  ,   3, 
    0,  0  ,   0,
    0,  1  , - 0 
  );

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum   (-  1,     1, 
               -  1,     1, 
                  1,1000.0);

  glMatrixMode(GL_MODELVIEW);
}
Run Code Online (Sandbox Code Playgroud)

然后TheScene是实际描绘的图片:

void TheScene() {

  glClear(
    GL_COLOR_BUFFER_BIT | 
    GL_DEPTH_BUFFER_BIT    
  );

  glMatrixMode(GL_MODELVIEW);

  // Draw red circle around origin and radius 2 units:    
  glColor3d(1,0,0);
  glBegin(GL_LINE_LOOP);
  for (double i = 0; i<=2 * M_PI; i+=M_PI / 20.0) {
    glVertex3d(std::sin(i) * 2.0, 0, std::cos(i) * 2.0);
  }
  glEnd();

  // draw green sphere at origin:
  glColor3d(0,1,0);
  glutSolidSphere(0.2,128, 128);


  // draw pink sphere a bit away    
  glPushMatrix();
    glColor3d(1,0,1);
    glTranslated(8, 3, -10);
    glutSolidSphere(0.8, 128, 128);
  glPopMatrix();

  SwapBuffers(hDC_opengl);
}
Run Code Online (Sandbox Code Playgroud)

应该在原点和周围红圈的中心绘制.但看着它只是感觉很奇怪,并且让我觉得绿球根本不在中心.

此外,粉红色的球应该被绘制成一个完美的圆形,而不是椭圆形.

所以,我错了,图片绘制正确,还是我设置错了?

650*_*502 5

你的期望完全错了

  • 三维圆的透视投影(如果圆是完全可见的)是椭圆形,但是圆的中心的投影通常不是椭圆的中心. 中心的视角扭曲

  • 球体的透视投影的轮廓通常是圆锥截面,即可以是圆形,椭圆形,抛物线形或双曲线形,取决于视点的位置,投影平面和3D中的球体.原因在于,球体的轮廓可以被想象为从视点开始并且接触球体与投影平面相交的锥体.

当然,如果您正在观察具有完全垂直相机的圆形,则圆的中心将投影到圆形投影的中心.同样地,如果您的相机精确指向球体,则球体轮廓将是圆形,但这些是特殊情况,而不是一般情况.

使用强视角(广角)相机,中心之间的这些差异更明显.使用平行投影而不存在这种明显的失真(即,圆心的投影恰好是圆的投影的中心).