Блоґ одного кібера

Історія хвороби контуженого інформаційним вибухом

Нульовий проект GLUT в Code::Blocks

with 6 comments

Середовище

Середовище

Поясню спочатку свій вибір середовища Code::Blocks. На жаль в Убунті немає своєї Visual Studio. Тим не менше вибір середовища програмування широченний. Спочатку я вирішив спробувати Eclipse, так як всі казали, що це найпотужніша платформа в Убунті. Але в неї дуже багато мінусів. По-перше, вона написана на Java, тому для своєї роботи запускає ще і віртуальну машину. Як результат – жре дуже багато пам’яті і процесора. Крім того, вона перекомпільовує код зразу після збереження, хоча не розумію який в цьому сенс. Ну і звісно, компіляція працює довго. Ще одним мінусом є відсутність підказки редактора. Можливо в Eclipse і зручно щось писати, але скоріше в Яві.

А для C++ і OpenGL, Code::Blocks підходить якнайкраще. По-перше, він не написаний на Java, і працює шустріше. По-друге, компіляція і запуск відбувається по натисненні кнопки F9, що в мене викликає приємні спогади про дитинство (точка зупинки ставиться по F5). По-третє, там є підказка редактора, і майстер GLUT.

Якщо в вас все вже встановлено, то запускаємо команду Файл-Новий-Проект. Вибираємо GLUT. Далі з’являється майстер, і починає ставити питання. Коли просять вибрати розтащування GLUT напишіть “/usr“. (Звісно якщо ви встановили GLUT). Після роботи майстра з’являється код, написаний якимось Нігелем Стьюартом (Nigel Stewart). Якщо він зразу не компілюється, а виводить незрозумілу помилку Cannot find -lXxf86vm нам треба доставити пакунок libxxf86vm-dev. Рішення інших проблем можна шукати там. Коли програма запуститься ми побачимо вікно з різними геометричними об’єктами, які за традицією вертяться. Ура!

Щоправда я пропоную трохи інше привітання світу. Забравши вікно, і додавши повноекранний режим і перспективну проекцію. Режим екрану вибирається командою glutGameModeString( "1280x800:32@60" );. Тут 1280×800 – вибрана роздільна здатність, 32 – глибина кольору, 60 – частота монітора. Я ввів зручні для мене, ви виберіть свої. Після вибору режиму в нього переходять по команді glutEnterGameMode();. І звісно варто не забути повернутися в нормальний стан перед завершенням роботи програми: glutLeaveGameMode();. І щоб вертілося, я намалював щось, що гордо названо конденсатором, а є двома квадратами.

#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>

static void resize(int width, int height)
{
    const float ar = (float) width / (float) height;

    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60,ar,1,100);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity() ;
}

void drawcondensator()
{
    glBegin(GL_QUADS);

        glColor3f(1,0,0);
        glNormal3d(0,0,-1);
        glVertex3d(1,1,0.1);
        glVertex3d(1,-1,0.1);
        glVertex3d(-1,-1,0.1);
        glVertex3d(-1,1,0.1);

        glColor3f(0,0,1);
        glNormal3d(0,0,1);
        glVertex3d(1,1,-0.1);
        glVertex3d(1,-1,-0.1);
        glVertex3d(-1,-1,-0.1);
        glVertex3d(-1,1,-0.1);

    glEnd();
}

static void display(void)
{
    const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
    const double a = t*90.0;

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glColor3d(1,0,0);

    glPushMatrix();
    gluLookAt(0,0,-5,0,0,0,0,1,0);
    glRotated(a,1,1,1);
    drawcondensator();
    glPopMatrix();
    glutSwapBuffers();
}


static void key(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 27 : // esc for exit
        case 'q':
            glutLeaveGameMode();
            exit(0);
            break;
    }

    glutPostRedisplay();
}

static void idle(void)
{
    glutPostRedisplay();
}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
const GLfloat light_position[] = { 0.0f, 0.0f, 5.0f, 0.0f };

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    glutGameModeString( "1280x800:32@60" ); //the settings for fullscreen mode
    glutEnterGameMode();

    glutReshapeFunc(resize);
    glutDisplayFunc(display);
    glutKeyboardFunc(key);
    glutIdleFunc(idle);

    glClearColor(0,0,0,1);

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glEnable(GL_LIGHT0);
    glEnable(GL_NORMALIZE);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);

    glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
    glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);

    glutMainLoop();

    return EXIT_SUCCESS;
}

Якщо є якісь запитання – запитуйте нижче.

Advertisements

Written by bunyk

Квітень 10, 2009 at 15:33

Оприлюднено в Графіка, Кодерство

Tagged with , ,

Відповідей: 6

Subscribe to comments with RSS.

  1. Працює і в Visual Studio 6.0 !

    Тарас

    Квітень 26, 2009 at 18:11

    • Спасибо, полезная статья.

      Только у меня первое приложение с glut’ом не заработало. Для этого потребовалось из списка статически линкуемых библиотек убрать xXf86vm:
      Project->Build options-> Вкладка linker settings, слева выбрать проект (не release, и не debug).

      jtim

      Серпень 7, 2009 at 01:36

  2. Как сделать такое задание, препод говорит оно совсем легенькое:
    Нарисувати зафарбований коло, усередині колоа – зафарбований правильний 9-

    кутник, усередині 9-кутника – зафарбований правильний 7-кутник, а усередині 7-кутника записати

    своє прізвище.

    Виталий

    Травень 6, 2015 at 07:34

    • Якщо не обов’язково щоб вони були вписані – то можна радіуси на око підібрати. Коло – це приблизно 100-кутник (більше або менше залежно від потрібної якості зображення). Для цього я б написав функцію що малює n-кутник заданого радіусу в заданих координатах заданим кольором, а тоді викликав тричі.

      Щодо тексту – треба викладача питати, бо там існує ціла купа різних способів. Один з найпростіших – вивести прямокутник з текстурою, на якій воно буде написано.

      bunyk

      Травень 6, 2015 at 08:15

      • вона так знає як і я, тоїсть нічого. а тут саме ось таке завдання.

        Виталий

        Травень 6, 2015 at 08:41

        • О, ну це добре що вона нічого не знає – можете робити як хочете.

          Але погано що ви нічого не знаєте, бо мені пояснювати вам як вивести на екран трикутник, що таке текстурні координати, чи що таке синус і косинус лінь. Тому краще б ви щось дізнались, а тоді питали якісь конкретніші запитання, типу “чого я роблю так, а виходить так?”.

          bunyk

          Травень 6, 2015 at 11:29


Залишити відповідь

Заповніть поля нижче або авторизуйтесь клікнувши по іконці

Лого WordPress.com

Ви коментуєте, використовуючи свій обліковий запис WordPress.com. Log Out / Змінити )

Twitter picture

Ви коментуєте, використовуючи свій обліковий запис Twitter. Log Out / Змінити )

Facebook photo

Ви коментуєте, використовуючи свій обліковий запис Facebook. Log Out / Змінити )

Google+ photo

Ви коментуєте, використовуючи свій обліковий запис Google+. Log Out / Змінити )

З’єднання з %s

%d блогерам подобається це: