12.07.2015 Views

Февраль

Февраль

Февраль

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

codingglEnable(GL_LIGHTING);glEnable(GL_LIGHT0);В первой строке мы разрешаем освещениев целом, а во второй — включаем источникGL_LIGHT0.ПостинсталлЧтобы освещение работало нормально, желательновключить нормализацию:glEnable(GL_NORMALIZE);glEnable(GL_AUTO_NORMAL);Несмотря на то что при построении сферы я будурассчитывать нормаль ручками, эти 2 флагавключены, чтобы ты знал об их существовании.Первый флаг разрешает нормализацию, а второй— разрешает это делать автоматом.По заданию необходимо предоставить возможностьотображения фигуры в виде каркаса. Какэто сделать? Очень просто. Наш полигон будетстроиться из закрашенных треугольников.Чтобы убрать закраску, можно добавитьследующую строку:glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);Здесь мы включаем отображение переднихи задних поверхностей полигоналиниями. Теперь это не закрашенныетреугольники, а линии, а значит, OpenGLнарисует только каркас.ПроекцияВ задании есть пункт, который требует от насобеспечить возможность отображенияв параллельной и перспективнойпроекции. Для начала определимся,что же это такое — параллельная и перспективнаяпроекция. При параллельнойпроекции все объекты проецируются наплоскость просмотра параллельно, безкаких-либо искажений. Однако наши глазане обладают такой широтой обзора, поэтомунам присуще перспективное зрениеи такая проекция воспринимается как болееестественная.Для работы с параллельной проекцией используетсяфункция glOrtho:void glOrtho(GLdouble left,GLdouble right, GLdoublebottom, GLdouble top, GLdoublenear, GLdouble far)/ 128Создание сферы с помощью линий. Слева — сфера из малого количества линий, поэтомуона угловатая. Справа линий в 4 раза больше, поэтому этот объект и на сферу похож большеУже по названиям переменных можно понять,что первые четыре задают прямоугольникпросмотра, а последние две — расстояниедо ближней и дальней плоскостей отсечениясоответственно. Все, что ближе near и дальшеfar, отображаться не будет.Чтобы задать перспективную проекцию, нужноиспользовать функцию gluPerspective:Листинг 1// Определяем контекст рисованияокнаHDC dc = GetDC(hWnd);// Задаем формат пикселяstatic PIXELFORMATDESCRIPTOR pfd = {sizeof(PIXELFORMATDESCRIPTOR),1, PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,24, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 32, 0, 0,PFD_MAIN_PLANE, 0, 0, 0, 0 };// Выбираем созданный форматint pixelFormat = ::ChoosePixelFormat(dc, &pfd);if (pixelFormat == 0){MessageBox(0,"ChoosePixelFormat error","Error", MB_OK);return FALSE;}// Установить формат пикселяif (::SetPixelFormat(dc,pixelFormat, &pfd) == FALSE){MessageBox(0,"SetPixelFormat error","Error", MB_OK);return FALSE;}void gluPerspective(GLdoubleangley, GLdouble aspect, GLdoubleznear, GLdouble zfar)Первый параметр — это угол обзора по оси Y.Второй параметр — соотношениесторон, в большинстве случаев его делают равнымотношению ширины окна к высоте. Далее// Создаем контекст OpenGLhrc = wglCreateContext(dc);wglMakeCurrent(dc,hrc);// Позиция источника освещения ипозиция просмотраGLfloat position[] ={ 0.0, 1, -1.5, 0.0 };GLfloat local_view[] = { 0.0 };// Включаем тест глубиныglEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);// Включаем освещениеglLightfv(GL_LIGHT0, GL_POSITION,position);glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,local_view);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);// Включаем нормализациюglEnable(GL_AUTO_NORMAL);glEnable(GL_NORMALIZE);/* Раскомментировать следующуюстроку, чтобы отображать в каркасномвиде *///glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);MoveWindow(hWnd, 10, 10, 640, 480,TRUE)xàêåð 02 /98/ 07

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!