Главная Статьи Ссылки Скачать Скриншоты Юмор Почитать Tools Проекты Обо мне Гостевая |
В этой статье мы рассмотрим как написать программу на С/С++, использующую графическую библиотеку OpenGL и библиотеку GLUT для организации платформенно-независимого ввода/вывода под Mac OS X.
В Mac OS X (в отличии от убогих форточек) сразу установлена последняя версия OpenGL (2.0) - поэтому в частности не нужно никаких дополнительных библиотек для работы с расширениями OpenGL и шейдерами - это все сразу доступно.
Более того, установив среду разработки, Вы устанавливаете не только библиотеку OpenGL (OpenGL.framework), но и библиотеку GLUT (GLUT.framework). Библиотека GLUT позволяет Вам писать программы с использованием OpenGL, не вникая во все сложности оконной системы (т.е. она предоставляет Вам некоторый платформенно-независимый API).
Итак мы сейчас рассмотрим написание простого OpenGL-приложения на С/С++ (работа с OpenGL через Cocoa и шейдеры будут рассмотрены в следующих статьях).
Итак, запускаем XCode и создаем новое приложение, выбрав в качестве его типа 'C++ Tool'/
Рис 1. Создание проекта.
Далее зададим имя проекту - Glut-Example и место для него.
Рис 2. Задание имени проекта.
После создания проекта необходимо подключить к нему две библиотеки - OpenGL и GLUT. Для этого в popup-меню корня проекта выберем Add/Existing Frameworks....
Рис 3. Добавляем библиотеки к проекту.
После чего добавим библиотеку /System/Library/Frameworks/OpenGL.framework.
Рис 4. Добавление OpenGL.framework.
Аналогичным образом добавляем GLUT.framework (из того же каталога).
Рис 5. Добавление библиотеки GLUT.
Аналогичным образом добавим к проекту файлы Vector3D.h и Vector3D.cpp (их использование несколько облегчит написание программ).
Основным отличием нашего приложения от обычных программ с использованием GLUT'а будет строка, подключающая файл glut.h:
#include <GLUT/glut.h>
В остальном можно использовать код практически любого примера для GLUT.
Рис 6.
Изменим стандартный файл main.cpp на приведенный ниже (все файлы и готовый проект для XCode можно скачать по ссылке в конце статьи).
#include <GLUT/glut.h> #include <stdlib.h> #include "Vector3D.h" Vector3D eye ( 7, 5, 7 ); // camera position Vector3D light ( 5, 0, 4 ); // light position float angle = 0; Vector3D rot ( 0, 0, 0 ); int mouseOldX = 0; int mouseOldY = 0; void init () { glClearColor ( 0.5, 0.5, 0.5, 1.0 ); glEnable ( GL_DEPTH_TEST ); glDepthFunc ( GL_LEQUAL ); glHint ( GL_POLYGON_SMOOTH_HINT, GL_NICEST ); glHint ( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST ); } void display () { glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); // draw the light glMatrixMode ( GL_MODELVIEW ); glPushMatrix (); glTranslatef ( light.x, light.y, light.z ); glColor4f ( 1, 1, 1, 1 ); glutSolidSphere ( 0.07f, 15, 15 ); glPopMatrix (); glMatrixMode ( GL_MODELVIEW ); glPushMatrix (); glRotatef ( rot.x, 1, 0, 0 ); glRotatef ( rot.y, 0, 1, 0 ); glRotatef ( rot.z, 0, 0, 1 ); glColor3f ( 1, 1, 0 ); glutSolidTeapot ( 2.5 ); glPopMatrix (); glutSwapBuffers (); } void reshape ( int w, int h ) { glViewport ( 0, 0, (GLsizei)w, (GLsizei)h ); glMatrixMode ( GL_PROJECTION ); // factor all camera ops into projection matrix glLoadIdentity (); gluPerspective ( 60.0, (GLfloat)w/(GLfloat)h, 1.0, 60.0 ); gluLookAt ( eye.x, eye.y, eye.z, // eye 0, 0, 0, // center 0.0, 0.0, 1.0 ); // up glMatrixMode ( GL_MODELVIEW ); glLoadIdentity (); } void motion ( int x, int y ) { rot.y -= ((mouseOldY - y) * 180.0f) / 200.0f; rot.z -= ((mouseOldX - x) * 180.0f) / 200.0f; rot.x = 0; if ( rot.z > 360 ) rot.z -= 360; if ( rot.z < -360 ) rot.z += 360; if ( rot.y > 360 ) rot.y -= 360; if ( rot.y < -360 ) rot.y += 360; mouseOldX = x; mouseOldY = y; glutPostRedisplay (); } void mouse ( int button, int state, int x, int y ) { if ( state == GLUT_DOWN ) { mouseOldX = x; mouseOldY = y; } } void key ( unsigned char key, int x, int y ) { if ( key == 27 || key == 'q' || key == 'Q' ) // quit requested exit ( 0 ); } void animate () { angle = 0.004f * glutGet ( GLUT_ELAPSED_TIME ); light.x = 2*cos ( angle ); light.y = 3*sin ( 1.4 * angle ); light.z = 3 + 0.5 * sin ( angle / 3 ); glutPostRedisplay (); } int main ( int argc, char * argv [] ) { // initialize glut glutInit ( &argc, argv ); glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH ); glutInitWindowSize ( 500, 500 ); // create window glutCreateWindow ( "Simple GLUT Example" ); // register handlers glutDisplayFunc ( display ); glutReshapeFunc ( reshape ); glutKeyboardFunc ( key ); glutMouseFunc ( mouse ); glutMotionFunc ( motion ); glutIdleFunc ( animate ); glutMainLoop (); return 0; }
Запустив проект на компиляцию и выполнение мы получим полноценное работающее OpenGL/GLUT-приложение.
Рис 7. Работающее приложение.
Весь исходный код можно скачать по этой ссылке.
В ближайшее время на сайте steps3d.narod.ru будут выложены исходные коды примеров к книгам Расширения OpenGL и Разработка и отладка шейдеров портированных для Mac OS X (т.е. они могут быть откомпилированы и запущены под Mac OS X/Linux/Win32)(правда РРС Маки не поддерживаются :((.