Мы называем нелицевой такую грань, внешняя поверхность которой скрыта от глаза. Это означает, что ее направленный наружу нормальный вектор, допустим ш, указывает в направлении, отличающемся менее чем на 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:
}
}

Разработайте приложение, которое рисует сетки для произвольной камеры, и проверьте скорость работы вашей программы с удалением и без удаления нелицевых граней.


⇐ Предыдущая| |Следующая ⇒