Выбор
способа вычисления нормалей
Верните знаки
на место и продолжим процесс приближения к шару. Прежде всего восстановим возможность
точного вычисления нормалей и дадим пользователю возможность интерактивного
выбора между приближенным и точным их вычислением. С этой целью введем глобальную
переменную
//======
Флаг способа вычисления нормалей
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. Надеюсь, что теперь важность точного
вычисления нормалей стала для вас еще более очевидной.