为什么我的有线球体在平移和改变摄像机角度的时候会变成椭圆体?

问题描述 投票:1回答:1

我需要将我的有线球体沿着z轴来回平移,同时也要改变摄像机角度。每当我的球体被翻译时,它就会慢慢变成椭圆体。我真的不明白为什么。这里你可以看到一些我认为是错误的代码。另外,当调整窗口大小时,形状不应该被改变,只能改变其大小。

void init() {
    glClearColor(0.0, 0.0, 0.0, 0.0);
      glEnable(GL_DEPTH_TEST);

    }


void display(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

 glPushMatrix();
    glLoadIdentity();
    gluLookAt(ex, ey, ez, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glTranslatef(0.0,0.0,tra);
    glScalef(0.65, 0.65, 0.65);
    glColor3f(1.0f, 0.8f, 1.0f);
    glutWireSphere(0.65, 10, 15);
    glPopMatrix();

 glPushMatrix();
    glLoadIdentity();
    gluLookAt(ex, ey, ez, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
    glColor3f(0.1f, 0.8f, 1.0f);
    glutWireTorus(0.25, 1.0, 15, 15);
    glPopMatrix();
    glFlush();

    glFlush();
    }

void reshape(int w, int h) {
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();


  gluPerspective(70.0, (GLfloat)w / (GLfloat)h, 1.0, 80.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
    }
c++ opengl glut opengl-compat
1个回答
0
投票

[...]同时也改变摄像机的角度。每当我的球体被翻译,它慢慢变成椭圆形。

那是由于 透视失真 或广角失真,并向视野边缘增加。这种效果可以通过减小视场角来降低,但这种效果永远不会被完全消除(平行投影除外)。参见 如何修复透视投影失真?.

另外,在调整窗口大小时不应该改变形状,只应该改变其大小。"

在透视投影时,物体的大小总是相对于视口的大小,而不是你屏幕的大小。

如果你不希望透视变形,如果你希望物体的大小必须是相对于屏幕的大小(以像素为单位),那么你必须使用正交投影,相对于视口的大小。

例如

void reshape(int w, int h) {
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    //gluPerspective(70.0, (GLfloat)w / (GLfloat)h, 1.0, 80.0);

    float sx = w / 100.0f;
    float sy = h / 100.0f;
    glOrtho(-sx/2.0f, sx/2.0f, -sy/2.0f, sy/2.0f, 1.0f, 80.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
© www.soinside.com 2019 - 2024. All rights reserved.