动画问题 - 翻译、投影 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
)。
最近我有
我现在遇到的问题是:我的动画中的球看起来不像在 .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
)。