При этом удобно иметь обычный набор вершин, цветов и текстурных координат, а также считать, что векторы нормали задаются в вершинах, а не на гранях. Это еще удобно и потому, что OpenGL поддерживает освещение, также используя значения нормали в вершинах.
Использование объектов, заданных таким образом, также удобно и тем, что стандартный OpenGL поддерживает так называемые вершинные массивы (vertex arrays), позволяющие не передавать по очереди все значения для каждой из вершин, а просто указать ссылки на массивы значений, из которых следует взять соответствующие значения. Подобный подход, позволяющий всего за несколько вызовов построить сложный объект, состоящий из сотен и даже тысяч граней, очень удобен и дает большое преимущество в скорости по сравнению с передачей каждого значения отдельным вызовом OpenGL.
Таким образом, каждый такой объект (их часто называют моделями, meshes), содержит в себе массив вершин, цветов, текстурных координат и векторов нормали. Также подобный объект может содержать в себе ссылку на используемую текстуру, ограничивающее тело и описания граней. Обычно считается, что каждая грань является треугольником, задаваемым тремя индексами в массив вершин.
Для поддержки таких объектов мы будем использовать следующий класс:
class Mesh3D : public Object {
public :
struct Face // triangular face
Добавляем модели
{
. int vertexlndex [3] ;
// indexes to array of vertices int texCoordlndex [3] ;
// indexes to array of texture coordinates
} ;
struct FaceVa // triangular face struct for
// usage with vertex arrays
{
int index [3 ] ;
} ;
private :
struct FaceOrderinglnfo
// struct used to keep info for // ordering transparent meshes
{
float key; // distance
int index; // facet #
} ;
int numVertices; int numTexCoords;
int numFaces; Vector3D * vertices;
Vector3D * normals ;
Vector2D * texCoords;
Vector4D * colors;
FaceVa * faces ;
Texture * texture;
BoundingBox boundingBox; Bool smooth;