英雄联盟(LOL)3d模型显示
2013-09-16 14:24
211 查看
英雄联盟(LOL)3d模型显示.
参考资料:http://code.google.com/p/lolblender/wiki/fileFormats
注:由于版本升级,lol模型的骨骼文件的文件格式发生变化,没法读取,网上资料也不全,骨骼读取还没有实现方法.
完整源代码:http://git.oschina.net/lyricc/LolView
标签: <无>
源码与演示:源码出处
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/18/02c631703dee52255821dcc74e697996)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/18/ccc6b20b807da5bb4bebf171dadb807b)
参考资料:http://code.google.com/p/lolblender/wiki/fileFormats
注:由于版本升级,lol模型的骨骼文件的文件格式发生变化,没法读取,网上资料也不全,骨骼读取还没有实现方法.
完整源代码:http://git.oschina.net/lyricc/LolView
标签: <无>
源码与演示:源码出处
Lol.h :
#ifndef _lol_h_ #define _lol_h_ namespace Lol { //00 type typedef int int32; typedef unsigned int uint32; typedef short int16; typedef unsigned short uint16; typedef char int8; typedef unsigned char uint8; typedef float float32; // 00 struct struct LolVertex { float32 position[3]; // xyz position of vertex int8 boneldx[4]; // Array of 4 bone number ID's float32 weights[4]; // Corresponding bone weights float32 normals[3]; // vertex normals float32 texcoords[2]; // vertex UV coordinates }; struct LolSknHeader { int32 magic; int16 numObjects; int16 matHeader; //---------if matHeader = 1---------------- int32 numMaterials; //if matHeader = 1 //------------------------- //-----block // if matHeader == 1 && numMaerials int8 nameMat[64]; // name of material int32 statVertex; // First vertex belonging to this material int32 numVertices; // Number of vertices in this material int32 startIndex; // First index belonging to this material int32 numIndices; // Number of indicies belonging to this material //if matHeader == 0 the above block will be absent from the file. //----count block ------------------------- // the values obtained here should match the sums of the numIndices and numVertices for the material blocks if present int32 numOfIndices; int32 numOfVertices; int16 *indices; // Array of vertex indices LolVertex*verteces; // Array of vertex values }; // skl // Bone ID's are implicit to their order in the file starting at 0. // So the first bone has an ID of 0, second bone an ID of 1, etc. struct LolSklBone { int8 name[32]; // name of bone int32 parent; // parent bone id. -1 implies no parent float32 scale; // scale of bone ? of armature? float32 matrix[12]; // 3*4 affine bone matrix in row major format(first four values // belong to first row ,2nd four to 2nd row .... }; // ---header // ---bone array struct LolSklHeader { int8 version[8]; // file format version ==== extra 1 for '\0' int32 numObjects; // num of objects int32 skeletonHash; // unique id int32 numElements; // num of bones LolSklBone* bonesArray;// }; // not finished - version 4 struct LolAnmHeader { int8 name[8]; int32 version; int32 sizeTillEnd; int32 magic3; int32 magic4; int32 magic5; int32 numofbones; int32 numofframes; float32 playbackFPS; int32 offset[9]; int32 datasize[3]; }; //---------------------------------------------------------------------------------------------------------- // interface LolSknHeader* loadSkn(char* file); void freeSkn(LolSknHeader*); void drawSkn(LolSknHeader*sknHeader, unsigned int texid); LolSklHeader*loadSkl(char*file); void freeSkl(LolSklHeader*); LolAnmHeader *loadAnm(char*file); } // end namespace #endif
Lol.cpp:
#include "Lol.h" #include "gl/glut.h" #include "gl/GL.h" #include <fstream> #include <assert.h> using namespace std; namespace Lol { LolSknHeader* loadSkn(char* file) { ifstream in(file,ios::binary); if(!in.is_open()) return NULL; LolSknHeader *header = (LolSknHeader*) malloc(sizeof(LolSknHeader)); memset(header,0,sizeof(LolSknHeader)); in.read((char*)&header->magic,4); in.read((char*)&header->numObjects,2); in.read((char*)&header->matHeader,2); assert(header->matHeader == 1 && "matHeader == else not implimented!"); in.read((char*)&header->numMaterials,4); in.read(header->nameMat,64); in.read((char*)&header->statVertex,4); in.read((char*)&header->numVertices,4); in.read((char*)&header->startIndex,4); in.read((char*)&header->numIndices,4); in.read((char*)&header->numOfIndices,4); in.read((char*)&header->numOfVertices,4); header->indices = (int16*)malloc(sizeof(int16) * header->numOfIndices); in.read((char*)header->indices,sizeof(int16)* header->numOfIndices); header->verteces = (LolVertex*)malloc(sizeof(LolVertex)* header->numOfVertices); in.read((char*)header->verteces,sizeof(LolVertex)*header->numOfVertices); return header; } void freeSkn(LolSknHeader* headerPtr) { if(headerPtr == 0) return ; if(headerPtr->indices) free(headerPtr->indices); if(headerPtr->verteces) free(headerPtr->verteces); free(headerPtr); } void drawSkn(LolSknHeader*sknHeader, unsigned int texid) { if(texid != 0) { glBindTexture(GL_TEXTURE_2D,texid); } glEnableClientState(GL_NORMAL_ARRAY); glEnableClientState(GL_VERTEX_ARRAY); // 1. glEnableClientState(GL_TEXTURE_COORD_ARRAY); glNormalPointer(GL_FLOAT,sizeof(LolVertex),&(sknHeader->verteces[0].normals[0])); glVertexPointer(3,GL_FLOAT,sizeof(LolVertex),sknHeader->verteces); // 2. glTexCoordPointer(2,GL_FLOAT,sizeof(LolVertex),&sknHeader->verteces[0].texcoords[0]); glDrawElements(GL_TRIANGLES,sknHeader->numOfIndices,GL_UNSIGNED_SHORT,sknHeader->indices); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); if(texid != 0) { glBindTexture(GL_TEXTURE_2D,0); } } LolSklHeader*loadSkl(char*file) { ifstream in(file,ios::binary); if(!in.is_open()) return NULL; LolSklHeader*sklPtr = (LolSklHeader*)malloc(sizeof(LolSklHeader)); memset(sklPtr,0,sizeof(LolSklHeader)); in.read(sklPtr->version,8); in.read((char*)&sklPtr->numObjects,4); in.read((char*)&sklPtr->skeletonHash,4); in.read((char*)&sklPtr->numElements,4); sklPtr->bonesArray = (LolSklBone*)malloc(sizeof(LolSklBone)*sklPtr->numElements); in.read((char*)sklPtr->bonesArray,sizeof(LolSklBone)*sklPtr->numElements); return sklPtr; } void freeSkl(LolSklHeader*sklHeadePtr) { if(!sklHeadePtr)return ; if(sklHeadePtr->bonesArray) free(sklHeadePtr->bonesArray); free(sklHeadePtr); } LolAnmHeader *loadAnm(char*file) { ifstream in(file,ios::binary); if(!in.is_open()) return NULL; LolAnmHeader*anmPtr = (LolAnmHeader*)malloc(sizeof(LolAnmHeader)); memset(anmPtr,0,sizeof(LolAnmHeader)); in.read((char*)anmPtr,sizeof(LolAnmHeader) - sizeof(anmPtr->datasize)); /* data.data_size4=data.start_offset5-data.start_offset4-- 12720 bytes data.data_size5=data.start_offset6-data.start_offset5-- 29296 bytes data.data_size6=file_size-data.start_offset6-- 36900 bytes */ anmPtr->datasize[0] = anmPtr->offset[4]- anmPtr->offset[3]; anmPtr->datasize[1] = anmPtr->offset[5]- anmPtr->offset[4]; anmPtr->datasize[2] = anmPtr->sizeTillEnd - anmPtr->offset[5]; int size = sizeof (LolAnmHeader); return anmPtr; } }
相关文章推荐
- (转)Unity3D NGUI在UI上显示3D模型
- opengl | openmesh 读取显示3d模型文件
- 使用Three.js + Blender构建在浏览器端显示的3D模型(5)
- 2d GUI的上层显示3d模型
- Unity3D NGUI如何在UI上显示3D模型
- 面片上显示3D模型
- 使用Three.js + Blender构建在浏览器端显示的3D模型(1)
- Collada 模型解析及3D显示
- 使用RenderTexture实现3D模型与UI的组合显示
- iOS显示3D模型,iOS和U3D混编(互相跳转)
- Min3D测试-在Android里面载入MMD模型-快速3D模型显示测试-By黑月君
- WP7-XNA 3D开发 显示3D模型(BasicEffect、DualTexturesEffect)
- 使用Three.js + Blender构建在浏览器端显示的3D模型(2)
- UNITY把3D模型显示在UI层级上的思路
- Unity3d中3D Text对模型的穿透显示
- 网页显示3D模型
- cocos2d-x 3.4 sprite3d c3b 模型无法显示的问题
- HTML5导入*.skp *.kmz模型的方法,类似sketchup,利用HTML5的3D性能将模型显示出来,请教一下,怎么弄啊
- 使用Three.js + Blender构建在浏览器端显示的3D模型(5)
- 使用Three.js + Blender构建在浏览器端显示的3D模型(3)