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はファイルごとに1つのオブジェクトを格納しますが、VW3dは複数のオブジェクトを格納し、同じオブジェクトジオメトリを異なる平行移動と回転で複数回再利用する可能性があると思います。

関数vw_BuildVBOとvw_BuildIndexVBOはいくつかの重要な作業を行っていますが、それらが何をしているのかは推測できますが、それらにアクセスできる方がよいでしょう。

他の潜在的な問題は、「回転」変数にあります。3つのフロートを保持する配列のようです。これは、彼らがオイラー回転を使用していることを示唆していますが、それを行うには複数の方法があります。オブジェクトの向きを正しく設定したい場合は、オブジェクトを描画するときにこれら3つのフロートがどのように使用されるかについてもう少し理解する必要があります。

于 2011-04-11T15:30:10.753 に答える