在VTK 或者Opengl纹理贴图中都会用到模型文件,当使用vtkOBJImporter函数读取模型数据时,需要对应的MTL文件才能实现纹理贴图,但是网上大多数的OBJ文件和MTL文件都是由模型软件导出来的,也很少有写MTL文件的,本文记录如何用c++写能够直接被vtkOBJImporter函数读取的模型文件和材质文件。
OBJ文件的组成
v:顶点坐标
vn:顶点法向量
Vt:纹理坐标
usemtl mtl:使用的材质,与mtl文件相呼应;
f:表示由顶点,法向量和纹理坐标所确定的面,如5/2/1表示 v开头的第5个顶点,这个点对应vn开头的第2个法向量,对应vt 贴图的第1个坐标;
将之前读取的3D点云,法向量,纹理和网格数据导入到向量中,由于写入OBJ文件的数据一定要ASCII或者二进制格式的,因此再定义3D向量点用于存储读取的数据,,按OBJ文件的组成顺序将向量一一写入,完成OBJ文件。
string num = "1";
vector<Point3d> v1(a);
vector<Point3d> vt(a);
vector<Point3d> vn(b);
vector<Point3d> f(b);
vector<Point3d> vec(b);
float s1=0, s2=0, s3=0;
for (int i = 0; i < a; i++)
{
v1[i].x = orig[i].x;
v1[i].y = orig[i].y;
v1[i].z = orig[i].z;
}
for (int i = 0; i < a; i++)
{
vt[i].x = uv[i].s;
vt[i].y = uv[i].t;
}
float max=0,min=0;
for (int i = 0; i < b; i++)
{
vn[i]