Выбор способа вычисления нормалей



Выбор способа вычисления нормалей

Верните знаки на место и продолжим процесс приближения к шару. Прежде всего восстановим возможность точного вычисления нормалей и дадим пользователю возможность интерактивного выбора между приближенным и точным их вычислением. С этой целью введем глобальную переменную

//====== Флаг способа вычисления нормалей

bool gbSmooth = false;

которая будет помнить текущий способ вычисления нормалей, и сделаем так, чтобы каждое нажатие клавиши N инвертировало эту переменную и способ вычисления нормали. Введите в функцию main реакцию на нажатие клавиши N, вставив строку

auxKeyFunc(AUX_n, KeyN);

Реализацию функции обработки вставьте до функции main:

void _stdcall KeyN()

{


//====== Изменяем способ вычисления нормалей

gbSmooth = !gbSmooth;

11====== Заново создаем список команд

DrawScene(); }

Введите новую версию функции setTria, которая учитывает выбранный способ вычисления нормалей:

void setTria(double *vl, double *v2, double *v3)

{

glBegin(GLJTRIANGLES);

//====== Если выбран способ точного вычисления нормали

if (!gbSmooth)

{

//====== Правая тройка векторов

double dl[3], d2[3], norm[3];

//====== Вычисляем координаты векторов

//====== двух сторон треугольника

for (int j = 0; j.< 3; j++)

{

dl[j] = vl[j] - v2[j); d2[j] = v2[j] - v3[j];

}

//====== Вычисляем нормаль к плоскости

//====== треугольника со сторонами dl и d2

getNorm(dl, d2, norm);

glNormalSdv(norm);

glVertex3dv(vl);

glVertex3dv(v2);

glVertex3dv(v3);

}

else

{

//=== Неточное (приближенное) задание нормали

glNorma!3dv(vl);

glVertexSdv(vl);

glNorma!3dv(v2);

glVertex3dv(v2);

glNorraalSdv(v3);

glVertex-3dv(v3);

}

glEnd ();

}

Запустите и проверьте результат, нажимая клавишу N. Надеюсь, что теперь важность точного вычисления нормалей стала для вас еще более очевидной.



Содержание раздела