Posts Tagged ‘Code::Blocks’
Нульовий проект GLUT в Code::Blocks
Поясню спочатку свій вибір середовища 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;
}
Якщо є якісь запитання – запитуйте нижче.


