2015-07-24 5 views
0

Я пытаюсь повернуть 2D-матрицу пикселей, но ничего на самом деле не происходит. Мое происхождение - это сохраненный bitmap[w x h x 3]. Почему не показано, что изображение повернуто? Вот функция отображения:openGL 2D-пиксельное вращение

void display() 
{ 
    uint32_t i = 0,j = 0,k = 0; 
    unsigned char pixels[WINDOW_WIDTH * WINDOW_HEIGHT * 3]; 

    memset(pixels, 0, sizeof(pixels)); 
    for(j = bitmap_h -1; j > 0; j--) { 
     for(i = 0; i < bitmap_w; i++) { 
      pixels[k++]=bitmap[j][i].r; 
      pixels[k++]=bitmap[j][i].g; 
      pixels[k++]=bitmap[j][i].b; 
     } 
    } 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glRotatef(90,0,0,1);  
    glDrawPixels(g_img.descriptor.size_w, g_img.descriptor.size_h, GL_RGB, GL_UNSIGNED_BYTE, &pixels); 

    glutSwapBuffers(); 
} 
+0

* «ничего на самом деле не происходит» *. Программа не запускается? Или изображение не отображается? Или отображается невращающееся изображение? –

+0

Если вы посмотрите 'glRotatef', он говорит - *" умножить текущую матрицу на матрицу вращения *. У вас есть текущая матрица? –

+0

'memset (pixels, 0, sizeof (pixels))' zeros-out размер типа 'pixels' - который должен быть указателем. Вы, скорее всего, хотите '* pixels'. – Olaf

ответ

4

В первую очередь glDrawPixels не следует использовать. Проблема, которую вы имеете, является одной из причин. Скрученные правила, с помощью которых glDrawPixels работают, слишком обширны, чтобы описать здесь, скажем так, что в вашем окне есть так называемая «растровая позиция», на которой glDrawPixels поместит нижний левый угол изображения, которое он рисует. Никакое преобразование не будет применено к изображению.

Однако при настройке растрового положения это происходит при применении преобразований. И если по какой-то причине растровое положение лежит за видимым окном, ничто не будет нарисовано вообще.

Решение: Не используйте glDrawPixels. Не используйте glDrawPixels.НЕ ИСПОЛЬЗУЙТЕ glDrawPixels. Повторяю НЕ ИСПОЛЬЗУЙТЕ glDrawPixels. Лучше всего забыть, что эта функция действительно существует в устаревшем OpenGL.

Используйте вместо этого текстурированный квадрат. Это также правильно преобразуется.

0

Я сделал что-то подобное. Я создаю 3D-шутер с использованием OpenGL/C++. Для одного из моих уровней у меня есть куча астероидов/камней в фоновом режиме, каждый из которых вращается и движется со случайной скоростью.

Я сделал это, взяв изображение растрового изображения астероидов и создав текстуру. Затем я применил текстуру к квадрату (glBegin(GL_QUADS)). Каждый раз, когда я рисую квадрат, я умножаю каждую из координат вершин (glVertex3f(x, y, z)) на матрицу вращения.

|cos0 -sin0| 

|sin0 cos0 | 

0 - тета угол. Я храню этот угол как часть своего класса Asteroid. каждая итерация я увеличиваю его на значение, в зависимости от того, насколько быстро я хочу, чтобы астероид вращается. Он отлично работает.

Смежные вопросы