我已经集成了'Assimp'librairy来加载我的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 :(得分: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后加载模型时确认)。
答案 1 :(得分:0)
Alias / Wavefront现在已经很老了,并且经过了很多拥有的公司,我非常怀疑你会在任何地方找到“官方”规范。
我建议Paul Bourke写的优秀文章,其中包括碰撞和置换贴图的关键字细节。 (但不是普通的地图 - 我认为它们不是OBJ的正式地图)
http://paulbourke.net/dataformats/mtl/
希望这有帮助。