Это потому, что вы устанавливаете матрицу вида модели в единичную матрицу в функции circle
.
Заменить glLoadIdentity
на glPushMatrix()
/ glPopMatrix()
в функции circle()
:
void circle(double radius, double xc, double yc) {
int i;
double angle = 2 * 3.1415 / 20; // circle is drawn using 20 line.
double circle_xy[100][40];
circle_xy[0][0] = radius + xc;
circle_xy[0][1] = yc;
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
// set fire position
glTranslatef(-40.0, 60.0, 0.0);
glBegin(GL_POLYGON);
for (i = 1; i < 20; i++) {
circle_xy[i][0] = radius * cos(i * angle) + xc;
circle_xy[i][1] = radius * sin(i * angle) + yc;
glVertex2f(circle_xy[i - 1][0], circle_xy[i - 1][1]);
glVertex2f(circle_xy[i][0], circle_xy[i][1]);
}
glEnd();
glPopMatrix();
}
Для создания кодаболее понятным, я рекомендую удалить glTranslatef
для drawAirBalloon
, но сделать это в display
:
void drawAirBalloon(void) {
// glTranslatef(squareX, squareY, squareZ); <--- remove
// ....
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// draw background
drawBackground();
glPushMatrix();
glTranslatef(squareX, squareY, squareZ); // <--- insert
// draw spray
drawSpray();
// draw hot air balloon
drawAirBalloon();
glPopMatrix();
// draw rain
drawRain();
calcFPS();
counter++;
glFlush();
glutSwapBuffers();
glutPostRedisplay();
}
Вы делаете много усилий, и вынаписать много хитрого и хорошо структурированного кода.Рекомендую, почитать про Vertex Specification и Shader .Продолжайте, но начните избавляться от устаревшего конвейера фиксированных функций и переключитесь на более современный способ рендеринга.