О число вершин текущей грани; О список индексов списка вершин для вершин текущей грани; О список индексов списка нормалей для вершин текущей грани. Например, простой сарай с рис. 6.4 будет записан в следующем виде:

10 7 7

ООО 1 0 0 1 1 0 0.5 1.5 0 0 1 0 0 0 1 10 1 111 0.5 1.5 1 Oil -10 0 -0.707 0.707 0 0.707 0.707 О 10 0 0-10 0 0 1 0 0-1 4 0 5 9 4 0 0 0 0 4 3 4 9 8 1 1 1 1 4 2387 2222 4 1276 3333

4 0165 4444
5 56789 55555 5 04321 66666

В этом списке первая грань является четырехугольником, вершины которого имеют номера 0,5,9,4; а две последние грани являются пятиугольниками.

Листинг 6.3. Чтение сетки из файла в память

int Mesh:: readFile (char * fileName) {

6.7. Тематические задания

fstream infile: infile.open (fileName. ios::in):

if(infile.fail())return -1: // error-can't open file // ошибка - не можем открыть^айл

i fС i nfi 1 e.eof()}return -1; // error-empty file // ошибка - файл пустой

infile » numVerts » numNorms » numFaces:
pt = new Point3[numVerts] ;
norm = new Vector3[numNorms] :

face - new Face[numFaces] : // check that enough memory was found: // проверяем, имеется ли достаточно памяти

if(!pt || Inorm || !face)return -1; // out of шелюгу // недостаточно памяти

for(int p - 0: p < numVerts: p++) // read the vertices // читаем вершины

infile » pt[p].x » pt[p].y » pt[p].z:

for(int n - 0: n < numNorms: n++) // read the normals // читаем нормали

infile » norm[n].x » norm[n].y » norm[n].z:

for(int f - 0: f < numFaces; f++) // read the faces // читаем грани

{
infile » face[f].nVerts: face[f].vert - new Vertexld[ face[f].nVerts]: for(int i = 0: i < face[f].nVerts: i++) infile » face[f].vert[i].vertlndex » face[f].vert[i].normIndex:
}
return 0: // success

// успешное окончание }

О Для чтения сетки из файла в программу можно применить код подпрограммы из листинга 6.3. Приняв имя файла, подпрограмма открывает и читает файл с этим именем в существующий объект класса Mesh и при успешном завершении операции возвращает нуль. При возникновении ошибки возвращается ненулевое значение: если, например, заданный файл не может быть найден. Подпрограмма должна выполнять дополнительную проверку на ошибки формата, вроде получения вещественного числа там, где ожидается целое. Отметим, что поскольку информация о требуемом размере сетки недоступна до того момента, пока считываются величины numVerts, numNorms и numFaces, то массивы, содержащие вершины, нормали и грани, размещаются с нужными размерами динамически во время выполнения программы. На Интернет-сайте этой книги имеется много файлов в вышеприведенном формате. (Они имеют расширение .3vn.) Кроме того, нетрудно конвертировать в этот формат объекты IndexedFace из библиотеки VRML 2.0. Столь же легко настроить подпрограмму int Mesh:: writeFileCchar* fileName), которая записывает каркасный объект в файл.


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