VW3D模型格式

VW3D Model Format

本文关键字:格式 模型 VW3D      更新时间:2023-10-16

最近,我一直致力于复活一款旧的开源游戏。我的主要问题是它使用自定义格式:VW3D。下面的代码片段用于从文件系统加载模型。是否有可能从下面的代码片段重建模型格式(并转换它)?我不知道我将如何去做,并将感激任何指示。我的希望是能够构建一个脚本转换到/从这种格式(规划vw3d到obj,反之亦然)

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);
}

您发布的代码非常直接。我特别喜欢西里尔语/英语评论对。您可能无法在VW3d和Obj格式之间完全来回转换。看起来VW3d是专门关于几何形状的,而Obj格式也提供了纹理、法线和材料属性。此外,我认为Obj每个文件存储一个对象,而VW3d存储多个对象,可能会通过不同的平移和旋转多次重用相同的对象几何。

函数,vw_BuildVBO和vw_BuildIndexVBO,正在做一些关键的工作,虽然我可以猜到他们在做什么,最好能访问他们。

另一个潜在的问题是'Rotation'变量。它似乎是一个包含3个浮点数的数组。这表明他们在用欧拉旋转,但有很多种方法。如果你想确保正确地定位对象,你需要更多地了解在绘制对象时如何使用这三个浮点数。