筆者介紹:姜雪偉,IT公司技術合伙人,IT高級講師,CSDN社區專家,特邀編輯,暢銷書作者,國家專利發明人;已出版書籍:《手把手教你架構3D游戲引擎》電子工業出版社和《Unity3D實戰核心技術詳解》電子工業出版社等。
CSDN視頻網址:http://edu.csdn.net/lecturer/144
在前面讀者已經學習了對模型的加密操作,在了解了3D加密模型的編寫后,下面將代碼編譯出可執行文件,編譯截圖如下:

編譯最終生成可執行文件目錄如下:

接下來開始修改加密的方式,開發者可以自己定義模型的加密方式和模型的擴展名字,首先找到C3BFile.cpp文件,在上節中已經實現了。在這里只把修改的重點函數給讀者展示一下,比如把擴展名字改成x3b,首先修改的類文件的save保存函數如下所示:
bool save(Settings * const&settings, modeldata::Model *model) {			bool result = false;			json::BaseJSONWriter *jsonWriter = 0;            		model->exportPart = settings->exportPart;			if(settings->outType == FILETYPE_ALL || settings->outType == FILETYPE_C3T)			{				std::stringout = settings->outFile;				int o = out.find_last_of(".");				out = out.substr(0, o+1) +  "c3t";				std::ofstream myfile;				myfile.open (out.c_str(), std::ios::binary);				log->status(log::sExportToG3DJ, out.c_str());				jsonWriter = newjson::JSONWriter(myfile);				(*jsonWriter) << model;				delete jsonWriter;				result = true;				myfile.close();			}			if(settings->outType == FILETYPE_ALL || settings->outType == FILETYPE_C3B)			{				std::stringout = settings->outFile;				int o = out.find_last_of(".");				out = out.substr(0, o+1) + "x3b";				C3BFile file;				file.AddModel(model);				file.saveBinary(out);				log->status(log::sExportToG3DB, out.c_str());			}			log->status(log::sExportClose);			return result;		}保存的文件名字需要修改成x3b,另一個修改擴展函數中定義的擴展文件名字的代碼如下所示:void setExtension(std::string&fn, constint&type) const {		switch(type) {			caseFILETYPE_FBX:	returnsetExtension(fn, "fbx");			caseFILETYPE_G3DB:	returnsetExtension(fn, "x3b");			caseFILETYPE_G3DJ:	returnsetExtension(fn, "c3t");			default:			returnsetExtension(fn, "");		}	}轉換保存后的模型文件格式是x3b,這樣轉換保存后的模型文件格式是x3b,接下來修改加密模塊,打開C3BFile.cpp文件,如下所示:bool C3BFile::saveBinary(const std::string& filepath)	{		_file = fopen(filepath.c_str(), "w+b");		// 文件標識		//char identifier[] = {'C','3','B','/0'};		unsigned char identifier[] = {8,52,67,19};		fwrite(identifier, 1, sizeof(identifier), _file);		//寫入版本		fwrite(GPB_VERSION, 1, sizeof(GPB_VERSION), _file);		_refTable.writeBinary(_file);		if(_models)		{			_models->writeBinary(_file);		}				_refTable.updateOffset(_file);		fclose(_file);		return true;	}已經將以前的代碼注釋掉了,修改成自定義的加密字符串,代碼行如下所示:
unsigned char identifier[] = {8,52,67,19};通過工具fbx-conv生成的x3b模型如下:
這樣我們自己也可以對模型進行加密操作。
總結:
           針對模型的加密已經完成,在這里也是告訴讀者,針對3D模型是如何實現加密的,也是給讀者提供了一種思路,程序員自己可以很容易的完成加密處理。模型加密的處理方式也是很多的,比如在模型的中間增加某個字段或者在模型插件中加入多個矩陣換算等等。
后面我會將其整理成書稿出版,敬請期待。。。。。。
新聞熱點
疑難解答