Создание сферы
Для иллюстрации рассматриваемых возможностей мы создадим сферу, составленную из треугольников, но при этом не будем отталкиваться от какого-либо правильного многогранника, а используем модель глобуса. Количество и пропорции треугольников будут зависеть от количества геодезических линий на сфере (параллелей и меридианов).
Если вы посмотрите на рис. 6.4 или представите себе глобус, то согласитесь с тем, что параллели и меридианы разбивают поверхность сферы на множество сферических четырехугольников. Исключение составляют лишь полюса, вокруг которых мы имеем сферические треугольники. Если затем каждый сферический четырехугольник разделить диагональю, то он даст два сферических треугольника.
Рис. 6.4. Разбиение сферы на треугольники
Мы будем управлять степенью дискретизации сферы с помощью двух чисел: количества колец (gnRings) и количества секций (gnSects). Они определяют как полное количество вершин, так и треугольников. Если глобально зададим переменные:
const UINT gnRings = 20; // Количество колец (широта) const UINT gnSects = 20; // Количество секций (долгота),
То, так как каждый прямоугольник разбит на два треугольника, общее количество треугольников будет:
<strong>const</strong> UINT gnTria = (gnRings+1) * gnSects * 2;
Нетрудно подсчитать и общее количество вершин:
const UINT gnVert = (gnRings+1) * gnSects + 2;
Мы уже, по сути, начали писать код, поэтому создайте новый файл Sphere.срр и подключите его к проекту, а предыдущий файл OG.cpp отключите. Эти действия производятся так:
- Поставьте фокус на элемент дерева OG.cpp в окне Solution Explorer и нажмите клавишу Delete. При этом файл будет отключен от проекта, но он останется в папке проекта.
- Переведите фокус на строку Console того же окна и, вызвав контекстное меню, дайте команду Add New Item.
- Выберите шаблон C++ File (.срр) и, задав имя файла Sphere.срр, нажмите ОК.
Введите в него директивы препроцессора, которые нам понадобятся, а также объявления некоторых констант:
#include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include <time.h> #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> const UINT gnRings = 40; // Количество колец (широта) const UINT gnSects = 40; // Количество секций (долгота) //====== Общее количество треугольников const UINT gnTria = (gnRings+1) * gnSects * 2; //====== Общее количество вершин const UINT gnVert = (gnRings+1) * gnSects + 2; //====== Два цвета вершин const COLORREF gClrl = RGB(0, 255, 0); const COLORREF gClr2 = RGB(0, 0, 255); const double gRad = 1.5; // Радиус сферы const double gMax =5.; // Амплитуда сдвига const double PI = atan(1.)*4,; // Число пи