Выбор способа вычисления нормалей
Верните знаки на место и продолжим процесс приближения к шару. Прежде всего восстановим возможность точного вычисления нормалей и дадим пользователю возможность интерактивного выбора между приближенным и точным их вычислением. С этой целью введем глобальную переменную:
//====== Флаг способа вычисления нормалей 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]; } //====== Вычисляем нормаль к плоскости //====== треугольника со сторонами d1 и d2 getNorm(d1, d2, norm); glNormal3dv(norm); glVertex3dv(v1); glVertex3dv(v2); glVertex3dv(v3); } else { //=== Неточное (приближенное) задание нормали glNormal3dv(v1); glVertexSdv(v1); glNormal3dv(v2); glVertex3dv(v2); glNormal3dv(v3); glVertex-3dv(v3); } glEnd (); }
Запустите и проверьте результат, нажимая клавишу N. Надеюсь, что теперь важность точного вычисления нормалей стала для вас еще более очевидной.