2011-04-10 68 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