2

我想知道gluLookAtwithglFrustum是否会扭曲渲染的图片。

这是渲染场景的方式:

在此处输入图像描述

这是呈现它的代码。

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);
}

然后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);
}

应该画在原点和围绕它的红色圆圈的中心。但是看着它就感觉很奇怪,让我觉得绿球根本不在中心。

此外,恕我直言,粉红色的球应该画成一个完美的圆形,而不是一个椭圆。

那么,我错了,图片绘制正确,还是我设置错误?

4

3 回答 3

5

你的期望完全错误

  • 3d 圆的透视投影(如果圆完全可见)是椭圆,但圆心的投影通常不是椭圆的中心。 中心的透视变形

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

当然,如果您正在使用完全垂直的相机查看一个圆圈,则该圆圈的中心将被投影到该圆圈投影的中心。以同样的方式,如果您的相机正好指向一个球体,那么球体的轮廓将是一个圆,但这些是特殊情况,而不是一般情况。

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

于 2011-02-06T22:19:41.933 回答
1

要查看屏幕中心的绿色球体,周围有一个完美的圆圈,您需要更改相机位置,如下所示:

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

不知道是什么导致了紫色球体的扭曲。

于 2011-02-06T21:52:06.053 回答
1

观点是正确的,只是看起来有些扭曲,因为事情就是这样融合在一起的。试试这个 gluLookAt,然后多玩一点:

gluLookAt (
    0,  2  ,   10, 
    0,  0  ,   0,
    0,  1  ,   0 
  );

我尝试的方法是使用允许我用鼠标调整位置和视图方向的设置,这样你就可以获得实时运动。当我四处走动时,你的场景看起来很好。如果您愿意,我可以为您提供完整的代码,以便您也可以这样做,但这比我想在这里提出的答案要多一些。

于 2011-02-06T21:54:48.140 回答