0

最近,我一直在努力复活一款旧的开源游戏。我的主要问题是它使用自定义格式: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);
}
4

1 回答 1

0

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

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

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

于 2011-04-11T15:30:10.753 回答