Мы называем нелицевой такую грань, внешняя поверхность которой скрыта от глаза. Это означает, что ее направленный наружу нормальный вектор, допустим ш, указывает в направлении, отличающемся менее чем на 90° от вектора, проходящего через глаз и любую точку Р на этой грани (см. рис.7.49, б). Если угол между двумя векторами меньше 90°, то их скалярное произведение положительно. Поэтому проверка того, является ли данная грань нелицевой, выглядит так: Грань F является нелицевой, если (Р - eye) m > 0.
Этот тест не занимает много ресурсов. Следовательно, проверка грани на невидимость и игнорирование ее при положительном ответе могли бы заметно ускорить рисование сложных каркасных объектов.
Приведенный ниже код является слегка измененной подпрограммой Mesh :: drawQ из листинга 6.2. Эта функция рисует только лицевые (видимые) грани каркасных объектов, игнорируя те грани, которые она определила как невидимые с помощью теста if (isBackFace(f,…)) continue. Напишите код для функции int isBackFaceQ, которая возвращает 1, если грань/является нелицевой, и 0 в противном случае. Предупреждаем, однако, что вершины каркасных объектов всегда преобразуются с помощью мат-
Трехмерный просмотр
рицы моделирования-вида, поэтому вам следует определиться, работать ли (и как) в мировых координатах, координатах глаза или в каких-нибудь еще. Вот этот код:
void Mesh:: drawFrontFacesO
// use OpenGL to draw this mesh
// для рисования этой сетки используем OpenGL
{
for(int f - 0: f < numFaces: f++) // draw each face {
if(isBackFace(f____)) continue:
glBegin(GL_POLYGON):
for(int v - 0: v < face[f].nVerts: v++) // for each one… // для каждой из них… {
int in - face[f].vert[v].normIndex : // index of this normal // индекс этой нормали
int iv - face[f].vert[v].vertlndex : // index of this vertex // индекс этой вершины
glNormal3f(norm[in].x, norm[in].y. norm[in].z):
glVertex3f(pt[iv].x. pt[iv].y. pt[iv].z):
}
glEndO:
}
}
Разработайте приложение, которое рисует сетки для произвольной камеры, и проверьте скорость работы вашей программы с удалением и без удаления нелицевых граней.