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

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

Posts Tagged ‘Code::Blocks

Нульовий проект 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 , ,