Простое любопытство с форматом материала ресурса волнового фронта

Я интегрировал библиотеку «Assimp» для загрузки компонентов файлов OBJ/MTL.

Все работает корректно.

Но давайте сосредоточимся на следующем примере файла MTL:

# Blender MTL File: 'plane.blend'
# Material Count: 1

newmtl PlaneMtl
Ns 96.078431
Ka 0.000000 0.000000 0.000000
Kd 0.640000 0.640000 0.640000
Ks 0.500000 0.500000 0.500000
Ni 1.000000
d 1.000000
illum 2

map_Ka ambient_texture.jpg
map_Kd diffuse_texture.jpg
map_Ks specular_texture.jpg
map_Bump bump_texture.jpg

И давайте рассмотрим следующий код:

aiMesh *pMesh = scene->mMeshes[idz];
aiMaterial *pMaterial = scene->mMaterials[pMesh->mMaterialIndex];

aiString ambient_texture_path, diffuse_texture_path, specular_texture_path, bump_texture_path;
pMaterial->GetTexture(aiTextureType_AMBIENT, 0, &ambient_texture_path);
pMaterial->GetTexture(aiTextureType_DIFFUSE, 0, &diffuse_texture_path);
pMaterial->GetTexture(aiTextureType_SPECULAR, 0, &specular_texture_path);
pMaterial->GetTexture(aiTextureType_HEIGHT, 0, &bump_texture_path);

std::cout << "AmbientTexture: " << ambient_texture_path.C_Str() << std::endl;
std::cout << "DiffuseTexture: " << diffuse_texture_path.C_Str() << std::endl;
std::cout << "SpecularTexture: " << specular_texture_path.C_Str() << std::endl;
std::cout << "BumpTexture: " << bump_texture_path.C_Str() << std::endl;

Вот результат:

ambient_texture.jpg
diffuse_texture.jpg
specular_texture.jpg
bump_texture.jpg

Как видите, все работает отлично, а ключевые слова 'map_Ka, map_Kd, map_Ks и map_Bump' относятся к картам объемного, диффузного, зеркального отражения и рельефа (высоты) соответственно. Так что эти ключевые слова верны.

Но как насчет текстуры нормалей (для отображения нормалей) и текстуры смещения (для отображения смещения)?

Я попытался добавить следующие строки в свой файл MTL для проверки:

map_Normal normal_texture.jpg
map_Disp disp_texture.jpg

используя код:

aiString normal_texture_path, displacement_texture_path;

pMaterial->GetTexture(aiTextureType_NORMALS, 0, &normal_texture_path);
pMaterial->GetTexture(aiTextureType_DISPLACEMENT, 0, &displacement_texture_path);

std::cout << "NormalTexture: " << normal_texture_path.C_Str() << std::endl;
std::cout << "DispTexture: " << displacement_texture_path.C_Str() << std::endl;

и вывод:

NormalTexture:
DispTexture:

Таким образом, ключевые слова «map_Normal» и «map_Disp» неверны и поэтому не являются частью документации Wavefront MTL.

Я не смог найти правильную и официальную документацию по формату WaveFront MTL (только в Википедии или туториалах нет ничего официального и полного).

Существует ли официальная документация по формату Wavefront MTL и OBJ со всеми ключевыми словами, описанными в ней?

Если это не так, кто-нибудь знает ключевые слова для нормальной текстуры и текстуры смещения?


person user1364743    schedule 19.10.2014    source источник


Ответы (2)


Alias/Wavefront теперь настолько устарел и прошел через такое количество компаний-владельцев, что я очень сомневаюсь, что вы где-нибудь найдете «официальную» спецификацию.

Я предлагаю превосходную статью Пола Бурка, которая включает детали ключевых слов для карт рельефа и смещения. (Но не карты нормалей - я не думаю, что они когда-либо были официальными для OBJ)

http://paulbourke.net/dataformats/mtl/

Надеюсь это поможет.

person Hugh Fisher    schedule 20.10.2014
comment
В порядке. Спасибо. Итак, какой формат вы можете мне предложить? - person user1364743; 20.10.2014
comment
Зависит от того, что вам удобно и что вы хотите импортировать. Collada разработан как очень гибкий формат обмена 3D. - person Hugh Fisher; 21.10.2014

Я знаю, что это старый вопрос, но мне нужно было использовать карты нормалей, и я использую файлы Assimp и OBJ, поэтому я искал и нашел ответ на этот вопрос. После просмотра исходного кода Assimp вы можете увидеть в assimp/code/ObjFileMtlImporter.cpp< /а>:

static const std::string DiffuseTexture      = "map_Kd";
static const std::string AmbientTexture      = "map_Ka";
static const std::string SpecularTexture     = "map_Ks";
static const std::string OpacityTexture      = "map_d";
static const std::string EmissiveTexture    = "map_emissive";
static const std::string EmissiveTexture_1  = "map_Ke";
static const std::string BumpTexture1        = "map_bump";
static const std::string BumpTexture2        = "map_Bump";
static const std::string BumpTexture3        = "bump";
static const std::string NormalTexture       = "map_Kn";
static const std::string ReflectionTexture   = "refl";
static const std::string DisplacementTexture = "disp";
static const std::string SpecularityTexture = "map_ns";

Как видите, Assimp использует map_Kn для обозначения нормальных текстур и disp для текстур смещения (подтверждено, когда я загрузил модель после изменения ее MTL).

person Chadys    schedule 28.04.2017
comment
Согласно Википедии, одна группа хочет, чтобы люди использовали norm для карт нормалей. - person Chuck Walbourn; 13.06.2018