动画问题 - 翻译、投影 OpenGL/C++

Issues with animation - translation, projection OpenGL/C++

最近我有 issue. Now that I've fixed that with given solution, I ran into some other issues. Here is a gif 个我必须实现的动画。

我现在遇到的问题是:我的动画中的球看起来不像在 .gif 的开头那样向前和向后移动。我相信这与 Ortho 有关,但我不知道如何解决这个问题。

此外,在某些时候,当它完全向右移动时,移动的球和环面刚好 "swallowed",它仅在起点可见,并在沿 z 轴平移时慢慢消失。这是我的代码。

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

    glPushMatrix();
    glColor3f(0.26f, 0.74f, 0.73f);
    glutWireTorus(0.2, 0.85, 17, 30);

    glPushMatrix();
    glTranslatef(0.0, 0.0, tra);
    glColor3f(0.9f, 0.5f, 0.3f);
    glutWireSphere(0.5, 17, 15);

    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(ex+0.0, ey+0.0, ez+10.0, cx, cy, cz, 0.0, 1.0, 0.0);
    glFlush();
    }

void reshape(int w, int h) {
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float sx = w / 70.0f;
    float sy = h / 70.0f;
    glOrtho(-sx/2.0f, sx/2.0f, -sy/2.0f, sy/2.0f, 1.0f, 600.0f);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

我认为这部分有一些错误。

如果你想要一个透视投影,其中对象的大小与屏幕分辨率有关并且与 window 的大小无关,那么你必须计算与window 的高度:

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

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    float angle_rad = atan((float)h / 600.0f) * 2.0f;
    float angle_deg = angle_rad * 180.0f / M_PI;
    gluPerspective(angle_deg, (GLfloat)w / (GLfloat)h, 1.0, 80.0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

视角与物体大小的关系是tan(fov / 2) * 2.,因此fov = atan(size) * 2,其中size取决于[=21=的大小] ((float)h / 600.0f).
您必须根据需要调整分隔线 (600.0f)。