pBall(B).pGrid(G).fShowGrid(f).LineWidth(L).NumTex()
{
// SetTexC'MapSmall.bmp"); }
void Render(void);

void GLOBE::SetTex(char *s): // Метод загрузки битовой карты

//и создания текстуры

}:

В конструктор класса GRIDBALL включается формирование текстурных координат. Сетка географических координат делит шар на клетки равных размеров. Таким же образом на равные клетки делится квадрат текстуры. Код конструктора класса GRIDBALL приведен в листинге 22.24.

Листинг 22.24

GRIDBALL::GRIDBALL(ColorFon F.double R_z.double Mer.double Par ):
Fon(F).Rz(R z).L0NG GR(Mer).LAT GR(Par)

Наложение текстур в OpenGL

{
double LONGJT - LONG_GR*Pi/180.01;
double LAT_ST - LAT_GR*Pi/180.01;
N1 - int((2*Pi+0.0001)/LONG_ST+l);
Nh - int((Pi+0.0001)/LAT_ST+l);
int i.j;
double di.dj:
Grid - new pMERIDIAN[Nl];

for( і - O.di - -Pi +L0NG_ST/2.0:і<N1;di+ - L0NG_ST,і++)//Цикл по меридианам {

Grid[i] - new TEXVERTEXl[Nh]; for(j - O.dj - -Pi/2;j<Nh;dj+ - LAT_ST.j++) {
SetKnotCi. j.di. dj); Grid[i][j].R - Fon.R; Grid[i][j].G - Fon.G; Grid[i][j].B - Fon.B; Grid[i][j].u - double(j)/(Nh-l); Gr1d[i][j].v - double(i)/(Nl-l): }
}
}

Если необходимо, чтобы географические координаты на шаре правильно совмещались с изображением на карте географических объектов, то нельзя просто делить текстуру на равные клетки. Необходимо учитывать, каким способом шар был спроецирован на плоскость карты. Если рисунок карты соответствует проецированию из центра шара на обернутую вокруг шара цилиндрическую поверхность, то при приближении к полюсам шаг клеток по вертикали должен увеличиваться. Точки, непосредственно прилегающие к полюсам, вообще не попадут на карту. То есть края картинки, соответствующие значениям и = 0 и и = 1, должны совмещаться не с полюсами, а с некоторыми параллелями в полярных областях.

Класс GLOBE дополнен методом создания текстуры, который вызывается при инициализации приложения. Метод получает путь к файлу, создает текстуру и заносит ее номер в поле NumTex класса, как показано в листинге 22.25.

Листинг 22.25

void GLOBE::SetTex( char *s) {

⇐ Предыдущая| |Следующая ⇒