VW3D模型格式
VW3D Model Format
最近,我一直致力于复活一款旧的开源游戏。我的主要问题是它使用自定义格式: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个浮点数的数组。这表明他们在用欧拉旋转,但有很多种方法。如果你想确保正确地定位对象,你需要更多地了解在绘制对象时如何使用这三个浮点数。
相关文章:
- 如何在openssl-ecc中获取十六进制格式的私钥
- 将"打开的CV图像"中的"颜色"转换为整数格式
- TDateTime格式在C++Builder中不会更改
- QTableView:endMoveRows在模型中重置水平页眉大小
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 将IBM Rhapsody模型集成到VS 2019中
- 检查不带转换的扫描格式
- 旋转模型矩阵时的形状失真
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 是否可以从格式字符串中检索"width"
- clang格式:宏的缩进
- clang格式:禁用排序包含
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何从TensorFlow .pb模型中获取权重格式?
- 从 Python 中以“.cpp”格式保存 LGBM 模型
- 将 STL 模型转换为 OSG 格式
- 用于将三维模型导入OpenGL/C++项目的推荐文件格式和图形库
- Qt:模型/视图-定义项目持有日期的格式
- 如何在3D模型格式之间进行转换?(Collada *.到ACIS *.例如Sat)
- VW3D模型格式