Форум программистов, компьютерный форум, киберфорум
OpenGL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
0 / 0 / 1
Регистрация: 08.10.2014
Сообщений: 17
1

Спрайтовая анимация в OpenGL

09.11.2014, 20:16. Показов 2421. Ответов 4
Метки нет (Все метки)

Здравствуйте.
Собственно, вопрос таков: как реализовать спрайтовую (покадровую) анимацию персонажа на OpenGL?
Я полагаю, что это организуется с помощью смены координат на текстуре с кадрами. Однако, вопрос в реализации. Буду благодарна любым ответам. с:
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.11.2014, 20:16
Ответы с готовыми решениями:

Анимация в OpenGL, а где собсно, анимация?
// Bounce.cpp // Demonstrates a simple animated rectangle program with GLUT // OpenGL SuperBible,...

OpenGl анимация
Всем привет. Нужно написать анимацию для вывода спрайта. Анимация заключается в замене...

анимация в openGL на С++
У кого работает на пишите пожалуйста? #include <GL/freeglut.h> Предоприделим глобальными...

opengl - анимация сферы
Пожалуйста, помогите. хотя бы советом)). задача состоит в том, чтобы прога рисовала трехмерный...

4
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
10.11.2014, 08:07 2
Gwen Stacy, я бы сделала проще:
1) загрузила бы массив текстур (кадров)
2) затем биндила бы нужный кадр в определенный момент времени с помощью glBindTexture.
0
0 / 0 / 1
Регистрация: 08.10.2014
Сообщений: 17
12.11.2014, 12:50  [ТС] 3
Цитата Сообщение от programina Посмотреть сообщение
в определенный момент времени
Вы имеете в виду, по таймеру?
Не могли бы Вы помочь с примерной реализацией?
Буду благодарна.
0
2061 / 617 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
12.11.2014, 22:42 4
Gwen Stacy, примерно так, только это не самый лучший вариант (потому что лучше создавать текстуры из одного рисунка)

Анимация 2D.zip

C++
/*
    Компиляция с помощью MinGW:
    g++ -o main.exe main.cpp -lgdi32 -lopengl32 -lglu32 -mwindows
*/
 
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <stdio.h>
 
 
HINSTANCE   hInstance;
HWND        hwnd;
HDC         hDC;
HGLRC       hRC;
MSG         msg;
bool        bQuit       = false;
 
int         winWidth    = 800;
int         winHeight   = 600;
 
 
 
// Декларация функций
 
LRESULT CALLBACK WindowProc ( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
void Init3D ();
void LoadBMP ( const char * path, unsigned int * tex );
 
 
 
 
/*
===============================================================================
 
Главная функция (начало выполнения программы)
 
===============================================================================
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    Init3D ();
 
 
    // настройка вида
    glViewport(0, 0, winWidth, winHeight);
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glEnable(GL_TEXTURE_2D);
 
 
 
    // позиция прямоугольника
    // относительно верхнего левого угла
    int     px  = 370;
    int     py  = 290;
    // половины ширины и высоты
    // прямоугольника
    int qx  = 200;
    int qy  = 200;
 
    unsigned int    num = 9;
    unsigned int    nKadr   = 0;
    unsigned int    texture[ num ];
 
    LoadBMP ( "0.bmp", &texture[ 0 ] );
    LoadBMP ( "1.bmp", &texture[ 1 ] );
    LoadBMP ( "2.bmp", &texture[ 2 ] );
    LoadBMP ( "3.bmp", &texture[ 3 ] );
    LoadBMP ( "4.bmp", &texture[ 4 ] );
    LoadBMP ( "5.bmp", &texture[ 5 ] );
    LoadBMP ( "6.bmp", &texture[ 6 ] );
    LoadBMP ( "7.bmp", &texture[ 7 ] );
    LoadBMP ( "8.bmp", &texture[ 8 ] );
    LoadBMP ( "9.bmp", &texture[ 9 ] );
 
 
 
    /* :::::::::: Главный цикл программы :::::::::: */
 
    while (!bQuit) {
        if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
            if (msg.message == WM_QUIT) {
                bQuit = true;
            }
            else {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        else {
            glMatrixMode(GL_PROJECTION);
            glLoadIdentity();
            glOrtho(0, winWidth, winHeight, 0, -10, 10); // 2D
 
            glClear(GL_COLOR_BUFFER_BIT);
 
 
            glPushMatrix();
                glTranslatef(px, py, 0.0);
                glColor3f(0.95, 0.93, 0.90); // немного затемним
                glBindTexture(GL_TEXTURE_2D, texture[ nKadr ] );
                glBegin(GL_QUADS);
                    glTexCoord2f(0.0, 0.0); glVertex3f(-qx, -qy, 0.0);
                    glTexCoord2f(0.0,-1.0); glVertex3f(-qx,  qy, 0.0);
                    glTexCoord2f(1.0,-1.0); glVertex3f( qx,  qy, 0.0);
                    glTexCoord2f(1.0, 0.0); glVertex3f( qx, -qy, 0.0);
                glEnd();
            glPopMatrix();
 
 
            SwapBuffers(hDC);
 
            // переключаем кадры от 0 до num
            nKadr += 1;
            if ( nKadr >= num ) { nKadr = 0; }
 
            Sleep(100);
        }
    }
 
    // удаляем текстуры
    for ( int i = num-1; i > -1; i-- ) {
        glDeleteTextures( 1, &texture[ i ] );
    }
 
    wglMakeCurrent(NULL, NULL);
    wglDeleteContext(hRC);
    ReleaseDC(hwnd, hDC);
    DestroyWindow(hwnd);
    return msg.wParam;
}
 
 
 
 
 
 
 
// ФУНКЦИИ:
 
/*
======================================
Оконная функция
======================================
*/
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg) {
        case WM_CLOSE:      { PostQuitMessage(0); break; }
        case WM_DESTROY:    { return 0; }
        default:            { return DefWindowProc(hwnd, uMsg, wParam, lParam); }
    }
    return 0;
}
 
/*
======================================
Функция создания окна
======================================
*/
void Init3D ()
{
    // создание окна
    WNDCLASSEX wcex;
    wcex.cbSize         = sizeof(WNDCLASSEX);
    wcex.style          = CS_OWNDC;
    wcex.lpfnWndProc    = WindowProc;
    wcex.cbClsExtra     = 0;
    wcex.cbWndExtra     = 0;
    wcex.hInstance      = hInstance;
    wcex.hIcon          = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor        = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground  = (HBRUSH)GetStockObject(BLACK_BRUSH);
    wcex.lpszMenuName   = NULL;
    wcex.lpszClassName  = "app";
    wcex.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
    RegisterClassEx(&wcex);
 
    hwnd = CreateWindowEx(0, "app", "Название программы", WS_OVERLAPPEDWINDOW, 50, 50, winWidth, winHeight, 0, 0, hInstance, 0);
    ShowWindow(hwnd, SW_SHOW);
 
    // создание графического контекста
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(pfd));
    pfd.nSize           = sizeof(pfd);
    pfd.nVersion        = 1;
    pfd.dwFlags         = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType      = PFD_TYPE_RGBA;
    pfd.cColorBits      = 24;
    pfd.cDepthBits      = 16;
    pfd.iLayerType      = PFD_MAIN_PLANE;
    hDC                 = GetDC(hwnd);
    SetPixelFormat(hDC, ChoosePixelFormat(hDC, &pfd), &pfd);
    hRC = wglCreateContext(hDC);
    wglMakeCurrent(hDC, hRC);
}
 
/*
======================================
Функция загрузки текстуры
======================================
*/
void LoadBMP ( const char * path, unsigned int * tex )
{
    BITMAPFILEHEADER    fileheader;
    BITMAPINFOHEADER    infoheader;
 
    FILE * file = fopen(path, "rb");
    fread(&fileheader, 1, sizeof(BITMAPFILEHEADER), file);
    fread(&infoheader, 1, sizeof(BITMAPINFOHEADER), file);
 
    unsigned int count = infoheader.biWidth * infoheader.biHeight;
 
    RGBQUAD * pixels = new RGBQUAD[count];
 
    for ( unsigned int i = 0; i < count; i += 1 ) {
        fread(&pixels[i].rgbRed,   1, 1, file);
        fread(&pixels[i].rgbGreen, 1, 1, file);
        fread(&pixels[i].rgbBlue,  1, 1, file);
        pixels[i].rgbReserved = 255; // непрозрачный
    }
 
    fclose(file);
 
    glGenTextures(1, tex);
    glBindTexture(GL_TEXTURE_2D, *tex);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, infoheader.biWidth, infoheader.biHeight, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    delete [] pixels;
}
0
4189 / 2295 / 388
Регистрация: 05.10.2013
Сообщений: 6,394
Записей в блоге: 177
13.11.2014, 01:14 5
Цитата Сообщение от Gwen Stacy Посмотреть сообщение
Вы имеете в виду, по таймеру?
Вот в этом видео, вроде, из одного рисунка создают. Можно извлечь, ещё что-то полезное, как мне кажется: http://www.youtube.com/watch?v=6OHMFwQK44k
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2014, 01:14

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Анимация куба OpenGL (C++)
У меня нарисована по граням игральная кость. Используется glEnable(GL_DEPTH_TEST) для глубины и...

Анимация сортировки массива на OpenGL
Задали курсовую анимация сортировки массива на OpenGL, элементы массива представляются...

Анимация идущего человечка в OpenGL (GLUT), С++
Нужно в visual studio сделать 2d человечка (стикмена), который ходит, прыгает и приседает.

glut & OpenGL & анимация, пару вопросов
использую библиотеку glut при работе с opengl, создал классы: enum color { white=1, black=2,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.