Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отрисовка сцены 
V
    Опции темы
Relrin
Дата 27.2.2012, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.2.2012

Репутация: нет
Всего: нет



Пробую OpenGL, ради интереса. Решил попробовать порисовать фигуры их перемещение, с изменением формы.  Единственное, не понимаю, почему не происходит перерисовка, т.к. рисует либо вооще только начальную фигуру, либо вообще отрисует один шаг, хотя их 15... Нужен совет/помощь :)

Код вот такой:
Код

const int width=800, height=800; //Задаем ширину и высоту окна

//Отрисовка многоугольника
void DrawPolygon(float X[], float Y[], float dX[], float dY[])
{
    int k;
    glBegin(GL_LINE_LOOP);        
        glColor3f(0.0f, 1.0f, 0.0f);
        for(k=0;k<5;k++)
          glVertex2f(X[k]+dX[k], Y[k]+dY[k]);   
         //   glVertex2f(X[1]+dX[1], Y[1]+dY[1]);
         //   glVertex2f(X[2]+dX[2], Y[2]+dY[2]);
         //   glVertex2f(X[3]+dX[3], Y[3]+dY[3]);
     //   glVertex2f(X[4]+dX[4], Y[4]+dY[4]);
    glEnd();
}

void display() 
{
    static int i,j;
    static float deltaX[5],deltaY[5];
    static float StartX[5]={-4.5, -4.5, -3.0, -3.0, -3.0};
    static float StartY[5]={-0.5,  1.0,  1.0,  1.0, -0.5};
    static float EndX[5]={ 2.9,  2.5,  3.7,  4.9,  4.5};
    static float EndY[5]={-0.8,  0.6,  1.3,  0.6, -0.8};

    //до границы
    for(i=0;i<15;i++)
    {
        glFlush();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        DrawPolygon(StartX,StartY,deltaX,deltaY);
        for(j=0;j<5;j++)
        {
            deltaX[j]=(EndX[5-j]-StartX[j])/15;
            deltaX[j]=(EndY[5-j]-StartY[j])/15;
        }
    }

}

int main(int argc, char** argv) 
{
    glutInit(&argc, argv);                    
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(width,height);           
    glutInitWindowPosition(0,0);                 
    glutCreateWindow("OpenGL Test"); 
    glOrtho(-5.0, 5.0, -5.0, 5.0, -1, 1);          
    glutDisplayFunc(display);                    
    glutMainLoop();                            
    return 0;
}

PM MAIL   Вверх
tzirechnoy
Дата 27.2.2012, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



Ну, у Вас в вызове DrawPolygon меняется только DeltaX, притом первый раз он вообще неиницыализирован -- а остальные 14 раз он совершэнно одинаковый.

Неудивительно, что никаких 15-и шагов у Вас не видно.
PM MAIL   Вверх
Relrin
Дата 27.2.2012, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.2.2012

Репутация: нет
Всего: нет



Цитата(tzirechnoy @ 27.2.2012,  17:10)
Ну, у Вас в вызове DrawPolygon меняется только DeltaX, притом первый раз он вообще неиницыализирован -- а остальные 14 раз он совершэнно одинаковый.

Неудивительно, что никаких 15-и шагов у Вас не видно.

Подравил малек, но все равно рисует пока тоже самое...

Код

void display() 
{
    static int i,j;
    static float deltaX[5],deltaY[5];
    static float StartX[5]={-4.5, -4.5, -3.0, -3.0, -3.0};
    static float StartY[5]={-0.5,  1.0,  1.0,  1.0, -0.5};
    static float EndX[5]={ 2.9,  2.5,  3.7,  4.9,  4.5};
    static float EndY[5]={-0.8,  0.6,  1.3,  0.6, -0.8};

    //обнуляем дельты
    for(i=0;i<5;i++)
    {
        deltaX[i]=0;
        deltaY[i]=0;
    }

    
    //до границы
    for(i=1;i<=15;i++)
    {
        glFlush();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        DrawPolygon(StartX,StartY,deltaX,deltaY);
        for(j=0;j<5;j++)
        {
            deltaX[j]=deltaX[j]+(EndX[5-j]-StartX[j])/15;
            deltaX[j]=deltaY[j]+(EndY[5-j]-StartY[j])/15;
        }
        glutPostRedisplay();
    }
    //после границы
}


Это сообщение отредактировал(а) Relrin - 27.2.2012, 17:18
PM MAIL   Вверх
Delit
Дата 27.2.2012, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 29.1.2012

Репутация: нет
Всего: нет



Код

for(j=0;j<5;j++)
        {
            deltaX[j]=deltaX[j]+(EndX[5-j]-StartX[j])/15;
            deltaX[j]=deltaY[j]+(EndY[5-j]-StartY[j])/15;
        }


deltaX дает один и тот же результат во всех 14 итерациях цикла(ну ты хотя бы какую нибудь буковку j замени на i) 
PM MAIL   Вверх
tzirechnoy
Дата 28.2.2012, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: 1
Всего: 16



1) У Вас опять DelteX = DeltaY + ...
2) Зачем Вам 5-j? Невыпуклая фигурка получается своеобразной.
3) glFinish(), а не glFlush() тогда уж.
4) И на большынстве современных систем Вы ничего не увидите из-за слишком большой скорости.
5) Поэтом делать надо с таймером и event loopом.
PM MAIL   Вверх
Relrin
Дата 28.2.2012, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 20.2.2012

Репутация: нет
Всего: нет



Да, спасибо, все работает! 

Вот конечный код:
Код

#include <gl/glut.h>   
#include <gl/gl.h>
#include <gl/glu.h>
#pragma comment (lib, "opengl32.lib") 
#pragma comment (lib, "glu32.lib")   
#pragma comment (lib, "glut32.lib")    
   
const int width=800, height=800; //Задаем ширину и высоту окна

//Отрисовка многоугольника
void DrawPolygon(float X[], float Y[], float dX[], float dY[],int coeff)
{
    int k;
    glBegin(GL_LINE_LOOP);        
        glColor3f(0.0f, 1.0f, 0.0f);
        for(k=0;k<5;k++)
          glVertex2f(X[k]+dX[k]*coeff, Y[k]+dY[k]*coeff);   
    glEnd();
}

//Главная функция, отвечающая за отображение фигур, точек, и т.д.
void display() 
{
    static int i,j;
    static float deltaX[5],deltaY[5];
    static float X[5],Y[5];

    static float StartX[5]={-4.5, -4.5, -3.0, -3.0, -3.0};
    static float StartY[5]={ 1.0,  2.5,  2.5,  2.5,  1.0};
    static float EndX[5]={ 4.5,  4.9,  3.7,   2.5,  2.9};
    static float EndY[5]={-2.3, -0.9, -0.2,  -0.9, -2.3};

    //определяем дельты
    for(i=0;i<5;i++)
    {
        deltaX[i]=(EndX[i]-StartX[i])/30;
        deltaY[i]=(EndY[i]-StartY[i])/30;
    }

    //Полиморфинг фигуры: квадрат -> пятиугольник
    for(i=0;i<=30;i++)
    {
        glFlush();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //закоментить-включить шлейф
        DrawPolygon(StartX,StartY,deltaX,deltaY,i);
        Sleep(200);
        glutPostRedisplay();
    } 

}

//Запуск GLUT как консолльное приложение
int main(int argc, char** argv) 
{
    glutInit(&argc, argv);                        
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
    glutInitWindowSize(width,height);         
    glutInitWindowPosition(0,0);                 
    glutCreateWindow("Лабораторная №1 по АлКГ");  
    glOrtho(-5.0, 5.0, -5.0, 5.0, -1, 1);          
    glutDisplayFunc(display);                      
    glutMainLoop();                            
    return 0;
}


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.0477 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.