最近我有 这个 的问题。现在,我已经用给定的解决方案解决了这个问题,我遇到了一些其他问题。下面是一个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();
}
我相信这部分里面有一些错误。
如果你想要一个透视投影,其中对象的大小是相对于屏幕分辨率而独立于窗口的大小,那么你必须计算视场角与窗口高度的关系。
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
)满足您的需求。