Найти в Дзене
Труды Кота

ХардКот №4, Только рога быка никогда не встречаются.

Личный прогресс в программировании.

Считаю формат OBJ простым и понятным инструментом для описания геометрии трехмерных объектов.

http://paulbourke.net/dataformats/obj/

После загрузки файла в виртуальную пространство оперативной памяти средствами ОС (через MapFileMapping), первым проходом подсчитываю количество вершин и полигонов для выделения места под массив вершин.

Геометрия считывается из буфера посимвольно в распараллеленом цикле.

Если первый символ новой строки "v", а второй — " "(пробел), то строка содержит три координаты вершины, "f" и " " — полигон и его координаты.

Второй проход переводит (парсит) текстовые значения координат вершин в вещественные и записывает в подготовленный массив.

Два вопроса возникают при подобном переводе.

1. При посимвольном считывании координат вершин необходимо учитывать знак вещественного числа, а точнее, местонахождение (порядковый номер) знака. Может быть значение -0.55555, а может, 0.55555.

2. Нет единого варианта точности, то есть разное число символов после запятой.

Пример 1:

С первой коодинатой вершины все ясно — после "v" и " ", третий символ либо "-", либо начало значения координаты X.

v 0.786019 -2.928538 0.601628

12!

Труднее определить порядковый номер символа начала второй вершины.

Пример 2:

v 0.786019 -2.928538 0.601628

1234567890!

Одиннадцатый символ " "(пробел) отделяет координату X от Y. Это крайне неудачное решение, но, увы. После парсинга первой координаты X (с 3-го символа до пробела), цикл должен парсить вторую координату Y.

Для указания порядкого номера начала второй координаты (от пробела) использую промежуточный расчет «Пролета» ("Span").

Пролет — это расстояние от третьего символа (начала первой координаты) до первого встреченного пробельного символа (функция strcspn).

Начало парсинга второй координаты = начало парсинга первой координаты + Пролет.

Третья координата вершины Z начинается с порядкового номера «Начало парсинга1 + Пролет2». Пролет2 = от любого символа во второй координате до первого встреченного пробела.

Тестирование:

1. Три координаты каждой вершины могут иметь знак + или -.

№ 1 2 3

1 + + +

2 - - -

3 + - -

4 - + +

5 + - +

6 - + -

7 + + -

8 - - +

2. Разное количество символов в целой и дробной части.

0.1111 или 2222.3333

3. Комбинированные варианты 1 и 2 в одной строке.

s — short (координата малого порядка), l — long (большого).

v s s s или v l l l или v -s l -l или v l -s l и так далее.

Для большинства вариантов промежуточный расчет пролетов работает приемлимо. Такой же расчет использую при парсинге Индекса полигонов.

Доклад закончил.

Прага, 2007 год
Прага, 2007 год