a_lighthousecat: (Default)
Воспользовавшись тем, что исходные коды Assimp открыты, с описанным выше багом сохранения материалов я разобралась. Однако проблемы на этом не закончились.

В .mtl-файле, описывающем материал, указывается коэффициент зеркального блеска SHININESS. Однако при загрузке материала с помощью Assimp, внутри своего приложения я получала не такое значение, как указано в файле. Методом пристального взгляда я определила, что загружается значение, ровно в четыре раза большее.

Действительно, в коде загрузчика Wavefront Obj нашлась совершенно замечательная строчка:

// multiplying the specular exponent with 2 seems to yield better results
pCurrentMaterial->shineness *= 4.f;

Поиск показал, что эта строчка привела в замешательство далеко не только меня. Но меня привела в замешательство не только и не столько она.

А то, что при этом при сохранении модели и материалов в файлы Wavefront Obj и Mtl - деление не производится. То есть взяли мы модель, загрузили, ничего не делали, сохранили - и материал поменялся.

Assimp

May. 16th, 2015 12:43 am
a_lighthousecat: (Default)
Assimp - весьма популярная библиотека импорта трехмерных моделей из файлов различных форматов.

Однако если присмотреться повнимательнее - она позволяет не только загружать модели, но и сохранять их. Другое дело, что сохранение моделей документировано заметно хуже, чем загрузка, и с ним придется повозиться и поискать примеры. Но разобраться вполне реально, поэтому я не буду останавливаться на этом вопросе.


Понадобилось мне, собственно, следующее:

- Загрузить 3D-модель из какого-нибудь формата (например, Wavefront OBJ, но необязательно)

- Некоторым образом ее преобразовать (удалить часть полигонов, части полигонов присвоить другие материалы)

- Сохранить модель (в Wavefront OBJ)


Пока моей задачей была работа с геометрией, а материал на всю модель был один, все шло отлично. А вот затем, с материалами, не заладилось: в файл все, вроде бы, сохраняется нормально, но при последующей загрузке тем же моим приложением, с использованием, опять же, Assimp, материалы загружаются некорректно. Либо все превращаются в JoinedMaterial_#63 (не обязательно именно 63, цифра может быть другая), либо сохраняют названия, но становятся одинаково серыми.


Приглядевшись, я обнаружила следующее: если в исходном файле материалов строки, описывающие цвет материала, начинались с Ka, Kd, Ks (с больших букв K), то в свежесохраненных файлах - с ka, kd, ks (то есть с маленьких). Кроме того, по непонятной причине в сохраненных файлах отсутствует строчка, описывающая коэффициент зеркального отражения. Я скачала исходники последней стабильной версии библиотеки, посмотрела в код: так и есть, проблема со строчными/заглавными буквами на месте. Вот в чем проблема с коэффициентом отражения - с ходу не поняла.


Но самое, на мой взгляд, удивительное в этой ситуации то, что я так и не смогла ничего конкретного по этому поводу найти в интернете. То ли мало кому доводилось сохранять в Wavefront OBJ с помощью Assimp, то ли те, кому доводилось, молча вносили небольшую поправку в исходники и пересобирали библиотеку, то ли я искать не умею...

April 2017

S M T W T F S
      1
234 5678
9101112131415
16171819202122
23242526272829
30      

Syndicate

RSS Atom

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 19th, 2017 08:45 pm
Powered by Dreamwidth Studios