3ds模型--换纹理续

第二步修改3ds中的纹理文件名

要修改先要知道原文件名和位置:

在 CLoad3DS::ProcessNextMaterialChunk 中的 case MATMAPFILE: 中加两句

case MATMAPFILE:            // 材质文件的名称
	{
	//------------------------------------------------+
	long cur_t=ftell(m_FilePointer);//得到当前文件位置
	//------------------------------------------------+

	// 读入材质的文件名称
	m_CurrentChunk->bytesRead += fread(pModel->pMaterials[pModel->numOfMaterials - 1].strFile, 1, m_CurrentChunk->length - m_CurrentChunk->bytesRead, m_FilePointer);
	
	//------------------------------------------------+
	save1geName(pModel->pMaterials[pModel->numOfMaterials - 1].strFile,cur_t);//保存文件名和位置
	//------------------------------------------------+
	}
	break;

default: 
增加一个函数:

//------------------------------------------------+
//保存纹理文件名
void save1geName(char *filename,long cur_t)
{
	
	FILE*  name;  
	fopen_s(&name, "replace.txt", "a");  
	
	char str[200];
	sprintf(str, "%s\n", name3DS);
	int count = fwrite(str, sizeof(char), strlen(str), name);  //3ds文件名

	sprintf(str, "%ld\n", cur_t);
	count = fwrite(str, sizeof(char), strlen(str), name);  //纹理文件名在3ds文件中的位置

	sprintf(str, "%s\n", filename);
	count =  fwrite(str, sizeof(char), strlen(str), name);  //纹理文件名

	strcpy(str, "\n");
	count =  fwrite(str, sizeof(char), strlen(str), name);  //用于替换的空行
	fclose(name); 
			
}
//------------------------------------------------+
由farTree.3ds得到replace.txt:

Data/3ds/farTree.3ds
229
主干.TGA

Data/3ds/farTree.3ds
453
树枝.TGA

Data/3ds/farTree.3ds
677
树根.TGA

Data/3ds/farTree.3ds
902
截面.TGA

Data/3ds/farTree.3ds
1126
近景_草0.TGA

Data/3ds/farTree.3ds
1405
近景_草0.TGA

Data/3ds/farTree.3ds
1686
近景_树?TGA

Data/3ds/farTree.3ds
1967
近景_树?TGA

Data/3ds/farTree.3ds
2238
01_1_30.TGA

Data/3ds/farTree.3ds
2511
TREE_LIT.TGA

Data/3ds/farTree.3ds
2791
ROCKFLOO.TGA

Data/3ds/farTree.3ds
3026
CE12_BG_.TGA
在哪个空行上填上要替换的文件名,长度要和原来的一样长(否则,我们就要修改文件长度,就复杂了)

不替换的不填

Data/3ds/farTree.3ds
229
主干.TGA
f_b4.bmp
Data/3ds/farTree.3ds
453
树枝.TGA
farT.bmp
Data/3ds/farTree.3ds
677
树根.TGA
f_b2.bmp
Data/3ds/farTree.3ds
902
截面.TGA
f_b0.bmp
Data/3ds/farTree.3ds
1126
近景_草0.TGA
f_back_3.bmp
Data/3ds/farTree.3ds
1405
近景_草0.TGA
f_back_3.bmp
Data/3ds/farTree.3ds
1686
近景_树?TGA
far_back.bmp
Data/3ds/farTree.3ds
1967
近景_树?TGA
far_back.bmp
Data/3ds/farTree.3ds
2238
01_1_30.TGA
01_1_30.bmp
Data/3ds/farTree.3ds
2511
TREE_LIT.TGA
TREE_LIT.bmp
Data/3ds/farTree.3ds
2791
ROCKFLOO.TGA
ROCKFLOO.bmp
Data/3ds/farTree.3ds
3026
CE12_BG_.TGA
CE12_BG_.bmp
然后运行替换程序(下面这个函数):

//更换纹理文件名
void replace1geName()
{
    ifstream in;     //文件读操作,存储设备读区到内存中    
    in.open("replace.txt");   //将文件流对象与文件连接起来   
    if(!in.is_open())   //若失败,则输出错误消息,并终止程序运行
		return;

    string dsname1,dsname2;  
	for( ; ; )
   {
	   size_t read;
	   getline(in,dsname1);
	   if(dsname1.length ()<5) //可能到文件结尾了
		break;  
	cout << dsname1 << '\n';  //3ds文件名---------------1

  	FILE*  wname;  
	fopen_s(&wname,dsname1.data() , "rb+");  //读写
	
	long cur_t;  
    in >> cur_t;  
		cout << cur_t << '\n';  //文件位置

	fseek( wname, cur_t, SEEK_SET );//恢复位置

    getline(in,dsname2);  //到行结束-----------------------2


    getline(in,dsname1);  
	cout << dsname1 << '\n';  //要替换的文件名-----------3

    getline(in,dsname2);  
	cout << dsname2 << '\n';  //用于替换的文件名-----------4

	if(dsname2.length()>5){
		char str[200];
		sprintf(str, "%s", dsname2.data ());
		int count = fwrite(str, sizeof(char), strlen(str), wname);  //写入文件名
		//
		//
	}
	fclose(wname); //关闭3ds
	}
	in.close();             //关闭文件输入流  txt
			
}
由于有些文件名被截短了,要改一下bmp名(没有的要找来)

效果:


主干,树枝为什么没有显示?是什么原因?纹理坐标?

用三通道的 bmp 替换四通道的 tga 可能不适合。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值