最简单的网格文件格式来编写四边形?

时间:2017-01-17 17:42:50

标签: graphics 3d polygon mesh vertex

我有1024 x 1024 x 1024的体素图,超过十亿个体素,我正在从XYZ轴遍历它们以找到它们内部的扫描轮廓。

每当我点击体素边界时,我想为遇到的面创建一个四边形参考,它包含4个顶点和一个三角形/四边形参考索引。

因为结果是5千万到6千万的四边形,我不认为我可以使用循环将数组写入内存并合并顶点,这将是太多的内存,我可以使用Meshlab来删除重复的顶点。 / p>

因此,每当我发现我遍历边界时,只需编写4个顶点和对它们的引用就很简单。

B /什么文件格式允许我像以下那样对文件流进行处理:

FORMAT= .EASY

vtxA: (2.0 , 5.0, 2,0)    nml(-1,0,0)
vtxB: (2.0 , 6.0, 2,0)    nml(-1,0,0)
vtxC: (2.0 , 5.0, 3,0)    nml(-1,0,0)
vtxD: (2.0 , 6.0, 3,0)    nml(-1,0,0)
QUAD: ABCD

vtxC: (1002.0 , 5.0, 2,0)    nml(1,0,0)
vtxD: (1002.0 , 6.0, 2,0)    nml(1,0,0)
vtxE: (1002.0 , 5.0, 3,0)    nml(1,0,0)
vtxF: (1002.0 , 6.0, 3,0)    nml(1,0,0)
QUAD: CDEF

3 个答案:

答案 0 :(得分:0)

我一直在研究obj,ply和stl文件格式,即使它是三角形,最简单的直接写入磁盘的人似乎也是stl,因为你可以写stram写入磁盘,没有需要阵列,有利于在实验室快速修复。

这是一个立方体示例:

solid cube
  facet normal 0 0 0
    outer loop
      vertex 0 0 0
      vertex 0 1 0
      vertex 1 1 0
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 0 0 0
      vertex 1 1 0
      vertex 1 0 0
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 0 0 0
      vertex 0 0 1
      vertex 0 1 1
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 0 0 0
      vertex 0 1 1
      vertex 0 1 0
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 0 0 0
      vertex 1 0 0
      vertex 1 0 1
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 0 0 0
      vertex 1 0 1
      vertex 0 0 1
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 0 0 1
      vertex 1 0 1
      vertex 1 1 1
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 0 0 1
      vertex 1 1 1
      vertex 0 1 1
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 1 0 0
      vertex 1 1 0
      vertex 1 1 1
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 1 0 0
      vertex 1 1 1
      vertex 1 0 1
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 0 1 0
      vertex 0 1 1
      vertex 1 1 1
    endloop
  endfacet
  facet normal 0 0 0
    outer loop
      vertex 0 1 0
      vertex 1 1 1
      vertex 1 1 0
    endloop
  endfacet
endsolid cube

用于编写上述代码的类型代码:

function Xquad( X:float , Y:float , Z:float , cnt:float){

//based on stl cube

  qstr+="facet normal " +"0 0 0"+ "\n"+
    "outer loop\n"+
      "vertex "+st(X)  +" "+ st(Y)   +" "+  st(Z)+   "\n"+
      "vertex "+st(X)  +" "+ st(Y+1) +" "+  st(Z)+   "\n"+
      "vertex "+st(X)  +" "+ st(Y+1) +" "+  st(Z+1)+ "\n"+
    "endloop\n" +
 "endfacet\n"+
  "facet normal " +"0 0 0"+ "\n"+
    "outer loop\n"+
      "vertex "+st(X)  +" "+   st(Y)  +" "+  st(Z)+   "\n"+
      "vertex "+st(X)  +" "+   st(Y+1)+" "+  st(Z+1)+ "\n"+
      "vertex "+st(X)  +" "+   st(Y)  +" "+  st(Z+1)+ "\n"+
    "endloop\n"+
  "endfacet\n";

}
function Yquad( X:float , Y:float , Z:float , cnt:float){

  qstr+="facet normal " +"0 0 0"+ "\n"+
    "outer loop\n"+
      "vertex "+st(X)  +" "+ st(Y) +" "+  st(Z)+   "\n"+
      "vertex "+st(X+1)+" "+ st(Y) +" "+  st(Z)+   "\n"+
      "vertex "+st(X+1)+" "+ st(Y) +" "+  st(Z+1)+ "\n"+
    "endloop\n" +
 "endfacet\n"+
  "facet normal " +"0 0 0"+ "\n"+
    "outer loop\n"+
      "vertex "+st(X)  +" "+ st(Y) +" "+  st(Z)+   "\n"+
      "vertex "+st(X+1)+" "+ st(Y) +" "+  st(Z+1)+ "\n"+
      "vertex "+st(X)  +" "+ st(Y) +" "+  st(Z+1)+ "\n"+
    "endloop\n"+
  "endfacet\n";

}
function Zquad( X:float , Y:float , Z:float , cnt:float){

  qstr+="facet normal " +"0 0 0"+ "\n"+
    "outer loop\n"+
      "vertex "+st(X)  +" "+ st(Y)   +" "+  st(Z)+ "\n"+
      "vertex "+st(X)  +" "+ st(Y+1) +" "+  st(Z)+ "\n"+
      "vertex "+st(X+1)+" "+ st(Y+1) +" "+  st(Z)+ "\n"+
    "endloop\n" +
 "endfacet\n"+
  "facet normal " +"0 0 0"+ "\n"+
    "outer loop\n"+
      "vertex "+st(X)    +" "+ st(Y)   +" "+  st(Z)+   "\n"+
      "vertex "+st(X+1)  +" "+ st(Y+1) +" "+  st(Z)+ "\n"+
      "vertex "+st(X+1)  +" "+ st(Y)   +" "+  st(Z)+ "\n"+
    "endloop\n"+
  "endfacet\n";

}

答案 1 :(得分:0)

我会使用二进制STL,每个四边形有两个tringles。更多信息:https://en.m.wikipedia.org/wiki/STL_(file_format)

答案 2 :(得分:0)

可能存储所需信息。对于您的方法,只需要存储一些先前四边形中使用的顶点的信息。不需要将四边形存储在内存中,因为它们可以写入文件中。

网格中有1025x1025x1025(〜= 1G)个顶点,顶点可以用网格坐标(x, y, z)的三元组来标识,其中0 <= x, y, z <= 1024。如果使用顶点而不是顶点数组中的顶点索引(写入文件。)

存储信息的标准方法是:

  • 将顶点坐标(x, y, z)映射到顶点索引的地图。映射对需要6个字节的存储器用于坐标(3×int16),并且4个字节用于顶点索引(&lt; = 1G)。 Map每个映射需要“少量指针”才能存储。我认为该映射可以实现为每个顶点使用少于30个字节,其中&lt; 2GB内存可满足您的需求。

  • 顶点网格大小(1025 ^ 3)的3D数组,其存储所有可能顶点的顶点索引。如果使用顶点而不是真实顶点索引,则使用顶点(或其他标志),如果未使用顶点。比地图更简单的实现。需要~4GB内存,这应该不是问题。