Веб программирование

C++ & GLUT. Урок 2. Рисование.

 
 

Приветствую! Сейчас порисуем в OpenGL.

После подключения библиотеки объявите две переменные:

float WinWidth = 400.0;
float WinHeight = 400.0;

Затем измените код функций main() и Subroutine() так:

void Subroutine()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-WinWidth/2, WinWidth/2, -WinHeight/2, WinHeight/2, -5.0, 5.0);
}

int main(int argc, char ** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(WinWidth, WinHeight);
    glutInitWindowPosition(100, 740);
    glutCreateWindow("Drawing with GLUT");
    glutDisplayFunc(Display);
    Subroutine();
    glutMainLoop();
}

З.Ы. Я подразумеваю, что вы снизошли до прочтения предыдущего урока.

Теперь будем рисовать сетку. Измените код функции Draw() так:

void Display()
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_LINES);
        for(int i = -WinWidth/2; i += 20)        {
            glVertex2f(i, -WinHeight);
            glVertex2f(i, WinWidth);
        }
        for(int i = -WinWidth/2; i += 20)         {
            glVertex2f(-WinHeight, i);
            glVertex2f(WinHeight, i);
        }
    glEnd();
    glFlush();
}

Результат:

Объясняю: функция glBegin() принимает тип того, что мы хотим рисовать, а функция glVertex рисует. Функция glColor() обозначает цвет того, что мы рисуем.

Сдвигаем сетку. Измените код функции Subroutine() так:

void Subroutine()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-WinWidth/2, WinWidth/2, -WinHeight/2, WinHeight/2, -200.0, 200.0);
    glMatrixMode(GL_MODELVIEW);
    glTranslatef(50.0, -50.0, 0.0);
}

Результат:

Объясняю: функция glTranslate(f или d - в зависимости от типа float или double соответственно) выполняет этот самый сдвиг.

Сжимаем сетку. Измените Subroutine() так:

void Subroutine()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-WinWidth/2, WinWidth/2, -WinHeight/2, WinHeight/2, -200.0, 200.0);
    glMatrixMode(GL_MODELVIEW);
    glScalef(0.5, 0.5, 1.0);
}

Результат:

Объясняю: то же самое, что и glTranslate. Тот же синтаксис, те же параметры. Только действие разное. Только один нюанс: если не хотите сжимать по определенной оси, ставите 1.0, а не 0.0.

Вращаем сетку. Немного объяснения: вращение происходит вокруг глобальных x, y и z. Вращение происходит под определенным углом (angle), важно, что против часовой стрелки и вокруг определенного вектора. Начало вектора всегда в (0.0.0), а конец укажем сами. Так как проекция у нас идет по осям x и y, вращать будем через z. Измените функцию subroutine так:

void Subroutine()
{
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-WinWidth/2, WinWidth/2, -WinHeight/2, WinHeight/2, -200.0, 200.0);
    glMatrixMode(GL_MODELVIEW);
    glScalef(0.5, 0.5, 1.0);
    glRotatef(15, 0.0, 0.0, 1.0);
}

Результат:

К слову говоря, если вам надо вращать по часовой, поставьте оси z в функции glRotate() отрицательное значение... или по какой оси вы там вращаете?

Это все. Удачи.


Есть вопросы? Спроси на нашем форуме!!
Кулхацкер [20.07.2012 06:37]

Опять разметка улетела!

for(int i = -WinWidth/2; i += 20)

Padre [20.07.2012 21:53]

Проверяй )

Кулхацкер [21.07.2012 06:40]

А-ай! Я в комментарии ошибся. Вот так:

for(int i = -WinWidth/2; i <= WinWidth/2; i += 20.0)
{
glVertex2f(i, -WinHeight);
glVertex2f(i, WinWidth);
}
for(int i = -WinHeight/2; i <= WinHeight/2; i += 20.0)
{
glVertex2f(-WinHeight, i);
glVertex2f(WinHeight, i);
}

Кулхацкер [21.07.2012 06:41]

<pre class="brush: cpp;">
for(int i = -WinWidth/2; i <= WinWidth/2; i += 20.0)
{
glVertex2f(i, -WinHeight);
glVertex2f(i, WinWidth);
}
for(int i = -WinHeight/2; i <= WinHeight/2; i += 20.0)
{
glVertex2f(-WinHeight, i);
glVertex2f(WinHeight, i);
}
</pre>

Кулхацкер [21.07.2012 06:42]

А-а. Фиг там. Не подсветишь в комментариях. :)

FireDay [21.07.2012 06:55]

Ты так рано встаешь, или так поздно ложишься?

Кулхацкер [21.07.2012 08:06]

Файрдей, это у вас время московское.



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.