2014-10-19 5 views
2

Я объединил Libreiry «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 со всеми ключевыми словами, объясненными внутри?

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

ответ

0

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

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

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

Надеется, что это помогает.

+0

Ok. Спасибо. Итак, какой формат вы можете мне предложить? – user1364743

+1

Зависит от того, с чем вам удобно и что вы хотите импортировать. Collada разработан как очень гибкий формат 3D-обмена. –

2

Я знаю, что это старый вопрос, но мне нужно было использовать обычные карты, и я использую файлы 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).

 Смежные вопросы

  • Нет связанных вопросов^_^