第二步。修改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 可能不适合。