Система OpenGL взгляд на 3D графику...
Итак все начинается с того что мы хотим чего то нарисовать или отобразить на экране, может это игра, или график функции а может это полноценный 3д редактор или какая то отдельная его часть нуу полет фантазий понятен ;)
С чего начать и куда копать? Помимо того что необходимо изучить новую не известную вам графическую систему, так еще требуется желательно большой опыт в программировании, вспомнить или хорошо знать школьную геометрию и немного математики не помешает.
Думаю для начала стоит написать тестовый инструмент, наглядный инструмент который поможет быстрее понять графику изнутри:
Будем писать на C# MS VS 2012 но можно и на С++ позднее опишу тонкости кстати использовать буду библиотеку Tao framework 2.2 можно использовать и Glut, FreeGlut,ClanLib и много чего еще другого, но пока что нужно ознакомится с основами.
Мы должны понять что такое проекция, как рисовать графические примитивы, как устроена координатная система, как перемещать фигуры, вращать но попробую по порядку.
Рисовать мы будем в декартовой системе координат и тут самое интересное что оси х, у, z могут быть направлены как угодно и куда угодно все это мы задаем сами или используем установки по умолчанию. Ось Z не будем использовать это как позже выясним будет глубина или как говорят художники перспектива.
Что такое проекция?
Посмотрим на рисунки их бывает две (ну есть еще третья изометрическая но не будем трогать ее) прямоугольная и пирамидальная
пирамидальная проекция
и прямоугольная
Между ближней плоскостью и дальней мы как раз и рисуем нашу графическую сцену если слишком близко к ближней плоскости выведем к примеру куб то часть куба будет урезана - отсечена аналогично и с дальней границей, куда важней не промахнутся при "рисовании" 3д фигур т.к мы можем выйти из проекции и никогда не увидим на экране наш результат, так что с этим осторожнее ;)
Свойства данных проекций как и + и - можно лишь увидеть на практике изменяя параметры и видя как они влияют на отображение сцены.
Пока что перейдем к С++ я использовал MS VS 2010 но вообще конечно не критично использовать какой либо язык, критично будет когда нужно выпустить конечный продукт и там будут конкретные требования и условия которые ваш выбранный язык может не обеспечить так что выбирать вам. И последнее использовал на данном примере я GLUT
Вот главная функция :
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH|GLUT_RGBA);
glutTimerFunc(500,glutTimer,1); - фу-ия таймера
glutInitWindowSize( w, h ); - инициализируем окно с размерами w,h
glutInitWindowPosition(50,50); - позиция окна на экране
glutCreateWindow("OpenGL 3D System"); - само окно и заголовок к нему
InitGL(); - здесь задаем некоторые надстройки
glutDisplayFunc(Draw); - указуем что фу-ия Draw будет рисовать
glutSpecialFunc(getkeys_down); - обработка клавиатуры
glutReshapeFunc(reshape); - изменение размеров окна и соответственно проекции
glutMouseFunc(mouseFunc); обрабатываем мышь
glutPassiveMotionFunc(moveMouse);
glutMainLoop(); глобальное зацикливание
return 0;
}
Создаете консольное приложение и прописуем данный код
void Draw()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
очищаем экран - сцену рассмотрим в теме буферов
glLoadIdentity();
сброс матрицы это будем разбирать в теме матриц
glBegin(GL_LINE_STRIP); рисуем связанные линии - 2д оси графика
glColor3f( 0.0, 1.0, 0.0 ); цвет в формате float чисел
glVertex3f(0.9f, -0.9f, -0.9f); задаем вершины прямых тот же формат
glColor3f( 1.0, 0.0, 0.0 );
glVertex3f( -0.9f, -0.9f, -0.9f);
glVertex3f( -0.9f, 0.9f, -0.9f);
glEnd(); заканчиваем рисовать
glFlush(); не замедлительно нарисовать
glutSwapBuffers(); переключаем буферы для отображения нарисованного на экране
}
void reshape (int w, int h)
{
если случайно размеры окна станут 0 то сделаем их по 100
if ( w == 0 && h == 0) { w = 100; h = 100; }
if ( w == 0 || h == 0 ) { w = 100; h = 100; }
glMatrixMode(GL_PROJECTION); режим матрицы проекций
glLoadIdentity(); матрицу проекций в 0 иначе будет каша на экране
матрицы имеют свойство накапливать результат
glViewport(0,0,GLsizei(w),GLsizei(h)); размер окна где будем рисовать
glMatrixMode(GL_MODELVIEW); а здесь матрица отображения фигур
glLoadIdentity();
}
создаем заголовки функций не возвращающих результата - void прописанных в main смотрим заголовки gl.h glut.h
void getkeys_down()
void glutTimer()
смотрим входящие аргументы там же
Не забываем подключать либы *.lib и заголовки *.h
я делаю это так
#pragma comment(lib,"glut32.lib")
Что бы уменьшить время копания что и где не работает из-за чего и почему попробуем идти путем наименьшего сопротивления:
для этого изменим цвет фона экрана если это произойдет то система OpenGL GLUT инициализирована правильно и будем рисовать если нет то будем копать почему не работает
glClearColor( 0, 0, 0.0, 0.0 );формат rgbA А это альфа канал как в фотошопе ))) прозрачность короче говоря пока что лучше не изменять а ставить 0.
Еще чуть-чуть отвлечемся и посмотрим как мы можем задавать в каком формате цвет и вершины
glColor3i -число обозначает количество компонент цвета а буква после числа формат здесь int
т.е как обычно glColor3i(123,34,12);
glColorvi(@clr); укажем массив цвета
Остальное открываем заголовки и смотрим все описанные фу-ии.
Если цвет экрана изменился то отлично начинаем рисовать,
самый простой способ через
glBegin(
GL_POINT - рисуем точки
а так изменим размер точки glPointSize(10) );
GL_LINE - естественно линии
GL_POLYGON - многоугольники
glEnd();
проще показать рисунок чем описывать
Позже продолжим изучать и рисовать и понимать все моменты графики...
Чуть не забыл )))
по умолчанию у нас вот такие координаты
и в InitGL задаем проекцию
void InitGL()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)w/(GLfloat)h, 0.1 ,15000.0);
glViewport(0,0,w,h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void InitGL()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0f,(GLfloat)w/(GLfloat)h, 0.1 ,15000.0);
glViewport(0,0,w,h);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
и последнее w and h это у нас размеры окна
int w = 800;
int h = 600;
Комментариев нет:
Отправить комментарий