Иллюстрированный самоучитель по Visual Studio .NET

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

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

//====== Флаг способа вычисления нормалей
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. Надеюсь, что теперь важность точного вычисления нормалей стала для вас еще более очевидной.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.