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