按材质分割OBJ模型

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;
}

分割前模型:                                                 



  

分割后模型:  
                                           



笔者自认才疏学浅,仅略知皮毛,文中错谬之处在所难免,若蒙诸君不吝告知,将不胜感激。

猜你喜欢

转载自blog.csdn.net/qq_29971371/article/details/81052980