Пример 6.2.3. Данные для тетраэдра На рис. 6.10 показан тетраэдр с вершинами в точках (0,0,0), (1,0,0), (0,1,0), (0,0,1) и представляющие его данные. Проверьте величины, приведенные в каждом поле. (Способы нахождения нормальных векторов мы рассмотрим позднее.)

Френсис Хилл

Рис. 6.10. Тетраэдр и представляющие его данные Вначале нужно разработать метод рисования такого каркасного объекта. Речь идет, разумеется,

0 рисовании каждой из его граней. Реализация метода Mesh: :draw() на базе OpenGL должна просматривать массив граней каркасного объекта и посылать в графический конвейер массив вершин и нормалей каждой грани. В OpenGL предусмотрено, что последовательные вершины ассоциируются с нормальным вектором m посредством выполнения процедуры gl Normal 3f(m.x, m.у, m.z)2. Тогда основное действие метода Mesh: :draw() выглядит так:

for(each face f in the mesh) // каждая грань f в сетке {

glBegin (GL_POLYGON): for(each vertex v in face f) II каждая вершина v грани f {

1 Определения основных классов Point3 и Vertex3 были дамы ранее, а также приводятся в приложении В.

2 Для правильного затенения нормальные векторы должны быть нормированы. Или поместите в функцию initO подпрограмму: gl Enable(GL_NORMALIZE), которая требует, чтобы OpenGL автоматически нормировал все нормальные векторы.

Глава 6. Моделирование поверхностей полигональными сетками

glNormal3f(norma 1 at vertex v): II нормаль в вершине v

glVertex3f(position of vertex v): // координаты вершины v

}

glEntJO: }

Реализация данного алгоритма приведена в листинге 6.2.

Листинг 6.2. Метод для рисования сетки с использованием OpenGL

void Mesh:: drawO

// use OpenGL to draw this mesh

// для рисования этой сетки используем OpenGL

{

for (int f =0: f < numFaces; f++) // draw each face // рисуем каждую грань

{

glBegin (GL_P0LYG0N):

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 // индекс данной вершины


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