1.分解原理
2.代码
1.分解原理
通过OBJ中face自带的标签信息进行文本分类,.并分类保存即可.
具体可以看代码的注释信息.
2.代码
#include<stdio.h>
#include<string.h>
#include<Windows.h>
#include<cstdio>
#define MAX 1000
using namespace std;
int main(int argc, char *argv[])
{
FILE *ff1,*ff2;
char sign1[16]="usemtl"; //识别位置
char sign2[16]="usemtl";
char fpName[1000];
char material[MAX][40];
char a[1000];//放置fgets的某一行内容
char c[5]="*\n";//这里将特定字符设置为 “*”
ff1=fopen("index.obj","r");//读打开原文件index.txt
ff2=fopen("index.obj","r");
if(ff1==NULL||ff2==NULL){
printf("打开文件失败\n");
exit(0);//退出
}
int i=0;
while(fgets(a,10000,ff1))//逐行执行index.txt里面的内容
{
if(strstr(a,sign1)!=0||strstr(a,sign2)!=0)//如果与输入的内容包括sign,
{
if(i==0)
{
strcpy(material[i++],a);
}
else{
for(int j=0;j<i;j++)
{
if(strcmp(material[j],a)==0)
{
break;
}
if(j==i-1)
{
strcpy(material[i++],a);
}
}
}
}
}
FILE *fp[i-1];
int temp=0;//tempi tempj 控制写入行的时间
int index=0;
for(int j=0;j<i;j++)
{
sprintf(fpName,"material-%d.obj",j);
fp[j]=fopen(fpName,"w");
}
while(fgets(a,10000,ff2))
{
if(strstr(a,sign1)!=0||strstr(a,sign2)!=0)
{
temp=1;
// printf("%s",a);
}
if(temp==0)
{
for(int j=0;j<i;j++)
{
fprintf(fp[j],"%s",a);
}
}
else
{
for(int j=0;j<i;j++)
{
if(strcmp(material[j],a)==0)
{
index=j;
fprintf(fp[j],"%s",a);
printf("%d",j);
}
else if (index==j&&strstr(a,sign1)==0&&strstr(a,sign2)==0)
{
//printf("%s",a);
fprintf(fp[index],"%s",a);
}
}
}
}
for(int j=0;j<i;j++)
{
fclose(fp[j]);//关闭写入文件
}
fclose(ff1);//关闭index文件
fclose(ff2);
return 0;
}
分割前模型:
分割后模型:
笔者自认才疏学浅,仅略知皮毛,文中错谬之处在所难免,若蒙诸君不吝告知,将不胜感激。