动画问题--翻译、投影 OpenGLC++的问题

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

最近我有 这个 的问题。现在,我已经用给定的解决方案解决了这个问题,我遇到了一些其他问题。下面是一个gif图 的动画,我必须实现。

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

另外,在某些时候,当它完全向右移动时,移动的球和环形物就会被 "吞噬",它只在起点处可见,当沿着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();
}

我相信这部分里面有一些错误。

c++ opengl glut opengl-compat
1个回答
1
投票

如果你想要一个透视投影,其中对象的大小是相对于屏幕分辨率而独立于窗口的大小,那么你必须计算视场角与窗口高度的关系。

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 取决于窗口的大小 ((float)h / 600.0f). 您必须调整分界线(600.0f)满足您的需求。

© www.soinside.com 2019 - 2024. All rights reserved.