2011-04-10 88 views
0

最近,我一直在努力恢复一个老的开源游戏。我的主要问题是它使用自定义格式:VW3D。以下代码片段用于从其文件系统加载模型。是否可以从下面的代码片段重新构建模型格式(并将其转换)?我不知道如何去做这件事,并会欣赏任何指针。我的希望是能够构建一个脚本转换到/从这个格式(规划vw3d到OBJ,反之亦然)VW3D模式格式

void eModel3D::ReadVW3D(const char *nName) 
{ 
    eFILE *file = 0; 
    file = vw_fopen(nName); 
    if (file == 0) return; 

    size_t SizeB = strlen(nName)+1; 
    Name = new char[SizeB]; 
    strcpy(Name, nName); 

    // пропускаем заголовок/skip header 
    file->fread(&DrawObjectCount, 4, 1); 


    // читаем, сколько объектов read how many objects 
    file->fread(&DrawObjectCount, sizeof(int), 1); 

    DrawObjectList = new eObjectBlock[DrawObjectCount]; 

    unsigned int GlobalRangeStart = 0; 


    // для каждого объекта for each object 
    for (int i=0; i<DrawObjectCount; i++) 
    { 
     DrawObjectList[i].RangeStart = GlobalRangeStart; 

     // FVF_Format 
     file->fread(&(DrawObjectList[i].FVF_Format),sizeof(int),1); 
     // Stride 
     file->fread(&(DrawObjectList[i].Stride),sizeof(int),1); 
     // VertexCount на самом деле, это кол-во индексов на объект In fact, this count of the index on an object 
     file->fread(&(DrawObjectList[i].VertexCount),sizeof(int),1); 
     GlobalRangeStart += DrawObjectList[i].VertexCount; 

     // Location 
     file->fread(&(DrawObjectList[i].Location),sizeof(float)*3,1); 
     // Rotation 
     file->fread(&(DrawObjectList[i].Rotation),sizeof(float)*3,1); 

     // рисуем нормально, не прозрачным draw a fine, not transparent 
     DrawObjectList[i].DrawType = 0; 

     // вертексный буфер Vertex Buffer 
     DrawObjectList[i].VertexBufferDestrType = 0; 
     DrawObjectList[i].VertexBuffer = 0; 
     DrawObjectList[i].VertexBufferVBO = 0; 
     // индексный буфер Index buffer 
     DrawObjectList[i].IndexBuffer = 0; 
     DrawObjectList[i].IndexBufferVBO = 0; 
    } 

    // получаем сколько всего вертексов get how many verticies 
    int VCount = 0; 
    file->fread(&VCount,sizeof(int),1); 

    // собственно данные actual data 
    GlobalVertexBuffer = new float[VCount*DrawObjectList[0].Stride]; 
    file->fread(GlobalVertexBuffer, VCount*DrawObjectList[0].Stride*sizeof(float),1); 

    // индекс буфер I.B. 
    GlobalIndexBuffer = new unsigned int[GlobalRangeStart]; 
    file->fread(GlobalIndexBuffer, GlobalRangeStart*sizeof(unsigned int),1); 


    // делаем общее VBO making the total VBO 
    GlobalVertexBufferVBO = new unsigned int; 
    if (!vw_BuildVBO(VCount, GlobalVertexBuffer, DrawObjectList[0].Stride, GlobalVertexBufferVBO)) 
    { 
     delete GlobalVertexBufferVBO; GlobalVertexBufferVBO=0; 
    } 

    // делаем общий индекс VBO makes the overall index VBO 
    GlobalIndexBufferVBO = new unsigned int; 
    if (!vw_BuildIndexVBO(GlobalRangeStart, GlobalIndexBuffer, GlobalIndexBufferVBO)) 
    { 
     delete GlobalIndexBufferVBO; GlobalIndexBufferVBO=0; 
    } 


    // устанавливаем правильные указатели на массивы establish the correct pointers to arrays 
    for (int i=0; i<DrawObjectCount; i++) 
    { 
     DrawObjectList[i].VertexBuffer = GlobalVertexBuffer; 
     DrawObjectList[i].VertexBufferVBO = GlobalVertexBufferVBO; 
     DrawObjectList[i].IndexBuffer = GlobalIndexBuffer; 
     DrawObjectList[i].IndexBufferVBO = GlobalIndexBufferVBO; 
    } 


    vw_fclose(file); 
} 

回答

0

您发布的代码非常简单。我特别喜欢西里尔/英文评论对。您可能无法在VW3d和Obj格式之间来回转换。它看起来像VW3d专门用于几何图形,而Obj格式也提供了纹理,法线和材质属性。此外,我认为Obj为每个文件存储一个对象,而VW3d存储多个对象,可能会多次使用同一对象几何体进行不同的平移和旋转。

函数vw_BuildVBO和vw_BuildIndexVBO正在做一些关键的工作,尽管我可以猜测他们在做什么,最好能够访问它们。

另一个潜在的问题是'旋转'变量。它似乎是一个拥有3个花车的阵列。这表明他们正在使用欧拉旋转,但有多种方法可以做到这一点。如果您想确保正确定位对象,则需要更多地了解绘制对象时如何使用这三个浮点数。

+0

谢谢。事实证明,我将不得不从openGL渲染器中转储数据,但这指出了我朝着正确的方向发展。 – Precursor 2011-04-23 16:04:13