Я создаю небольшой анимационный фильм с использованием OpenGL 3 и реализую его в сообществе Visual Studio 2015. Я пытаюсь сделать анимацию динозавра, движущегося вправо, по крайней мере, вначале, но я не могу как-то оживить его.

Вот мой основной:

#include "glut.h"
#include "globaldeclare.h"
#include "dino.h"
#include "scene1.h"
#include "scene1_animation.h"
#include 

void init(void)
{
    glClearColor(0.0, 204.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 500, 0, 500);
    glMatrixMode(GL_MODELVIEW);

}

void myIdle() {
    frame++;
    scene1_dino_idle();
    glutPostRedisplay();
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    //Animation happens here
    if (scene_counter == 1) {
        scene1();
        scene1_animation();
    }

    glutSwapBuffers();
}

int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(1300, 800);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("Walking with dinosaur");
    glutDisplayFunc(display);
    glutIdleFunc(myIdle);
    init();
    glutMainLoop();
    return 0; 
}

Здесь происходит анимация для сцены1 (но этого не происходит.):)

void scene1_dino_idle() {
    //idle
    if (dino_slidey > 0 && dino_count == 1) dino_movey = 1;
    if (dino_movey == 1 && dino_count == 1) dino_slidey -= 2;//1
    if (dino_slidey < -30 && dino_count == 1) dino_movey = 0;
    if (dino_movey == 0 && dino_count == 1) dino_slidey += 2;//1

    if (dino_slidex > 1000 && dino_count == 1) { dino_movex = 1; dino_count = 2; dinoleg_count = 2; }
    if (dino_movex == 1 && dino_count == 1) dino_slidex -= 6;//4
    if (dino_slidex < -1600 && dino_count == 1) dino_movex = 0;
    if (dino_movex == 0 && dino_count == 1) dino_slidex += 6;//4
}

void scene1_dino_animation() {
    //moving to the right
    glPushMatrix();
    if (dino_count == 1) {
        glTranslatef(dino_slidex, dino_slidey, 0);
        glTranslatef(0, 100, 0);
        glScalef(0.6, 0.6, 1);
    }
    glScalef(dinoR_lost, dinoR_lost, 0);
    dino();
    glPopMatrix();
}

void scene1_animation() {
    scene1_dino_animation();
}

Мои глобальные переменные // счетчик кадров int frame, scene_counter = 1;

//dino animation
float dino_movex, dino_movey, dino_count, dino_slidex, dino_slidey, dinoR_lost, dinoL_lost;

//dino leg
float dinoleg_angle = 0, dinoleg_move_x, dinoleg_move_y, dinoleg_count = 0;

Я нарисовал сцену, но не могу ее анимировать. Мне кажется, что я сделал правильно в анимации и, возможно, где-то в моей функции ожидания не позволяет мне заставить ее работать. Я пробовал все, но не могу заставить это работать, и я действительно не знаю, в чем проблема. Пожалуйста, дайте мне знать, в чем основная проблема. Заранее спасибо.

Ответы (2)

Мне удается заставить его работать. В некоторых сценах, которые я нарисовал, был только динозавр, но он не двигался, поэтому я удалил dino () из моего scene1 () из scene1.h. После этого он пропал, но я заметил, что какая-то точка двигается (не знаю, откуда это взялось). Теперь я исправил это, добавив glutPostRedisplay () в функцию scene1_dino_idle (). Затем я удаляю этот код glScalef (dinoR_lost, dinoR_lost, 0);, чтобы появился динозавр. Спасибо всем за помощь. С Новым годом.

Я предполагаю, что большинство названных переменных являются глобальными. Поскольку вы не показали нам начальные значения, я предполагаю, что они все равны нулю (кроме scene_counter и dino_count; ничего не происходит, если любое из них равно нулю), и шаг за шагом несколько итераций. (Прошу прощения за переполненный макет этой трассировки.) Это значения на входе для каждого вызова scene1_dino_idle ():

  scene_counter   dino_movey   dino_slidey  dinoleg_count
frame  | dino_count | dino_movex | dino_slidex   |
  |    |      |     |      |     |      |        |
  1    1*     1*    0      0     0      0        0
  2    1      1     0      0     2      6        0
  3    1      1     1      0     0     12        0
  4    1      1     1      0    -2     18        0
  5    1      1     1      0    -4     24        0
. . .
  f    1      1     1      0 (f-3)*-2 (f-1)*6    0
. . .
 18    1      1     1      0   -30    102        0
 19    1      1     0      0   -30    108        0
 20    1      1     0      0   -28    114        0
. . .

Судя по этому небольшому следу, кажется, что проблема связана с тем, что scene_counter или dino_count (или оба) равны нулю. Другая возможность состоит в том, что у вас проблемы с областью видимости ваших глобальных переменных; если где-то в ваших объявлениях есть опечатка, C может обрабатывать одну или несколько из них как локальные переменные. (В некоторых версиях C переменные, которые явно не объявлены, по умолчанию будут иметь значение int.)

Без ваших заголовков мы не сможем сказать, что не так.

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

Лучшее, что я могу сказать, не компилируя его сам и не пытаясь угадать, что вы упустили, код OpenGL в порядке.

2022 WebDevInsider