Формат модели VW3D - PullRequest
       5

Формат модели VW3D

0 голосов
/ 10 апреля 2011

В последнее время я работаю над возрождением старой игры с открытым исходным кодом.Моя главная проблема в том, что он использует собственный формат: 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);
}

1 Ответ

0 голосов
/ 11 апреля 2011

Код, который вы разместили, довольно прост.Мне особенно нравятся кириллические / английские пары комментариев.Вы, вероятно, не можете полностью конвертировать туда и обратно между форматами VW3d и Obj.Похоже, что VW3d предназначен исключительно для геометрии, в то время как формат Obj также предоставляет текстуры, нормали и свойства материала.Кроме того, я думаю, что Obj хранит один объект на файл, в то время как VW3d хранит несколько объектов, потенциально многократно используя одну и ту же геометрию объекта с различными переводами и поворотами.

Функции vw_BuildVBO и vw_BuildIndexVBO выполняют некоторые ключевыеработать, хотя я могу догадаться, что они делают, было бы лучше иметь к ним доступ.

Другая потенциальная проблема заключается в переменной 'Вращение'.Кажется, это массив, содержащий 3 числа.Это говорит о том, что они используют ротацию Эйлера, но есть несколько способов сделать это.Если вы хотите убедиться, что объекты правильно ориентированы, вам нужно немного больше понять, как эти три числа используются при рисовании объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...