Сделать огонь всплыть - PullRequest
       1

Сделать огонь всплыть

0 голосов
/ 19 декабря 2018
// this is the display function it is called when ever you want to draw something all drawing should be called form here
void display() {
    glClear(GL_COLOR_BUFFER_BIT);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    // draw background 
    drawBackground();
    glPushMatrix();
    // draw hot air balloon
    drawAirBalloon();
    // draw spray
    drawSpray();
    glPopMatrix();
    // draw rain
    drawRain();
    // draw fire
    drawSpray();
    calcFPS();
    counter++;
    glFlush();
    glutSwapBuffers();
    glutPostRedisplay();
}

Проблема в том, что я не могу разжечь огонь своим воздушным шаром.Причина, по которой я только поместил код выше (дисплей), заключается в том, что я думаю, что проблема связана с этим конкретным кодом.

Чтобы увидеть полный код, нажмите на ссылку ниже:

код воздушного шара

Это проблема: enter image description here

1 Ответ

0 голосов
/ 19 декабря 2018

Это потому, что вы устанавливаете матрицу вида модели в единичную матрицу в функции 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 .Продолжайте, но начните избавляться от устаревшего конвейера фиксированных функций и переключитесь на более современный способ рендеринга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...