我有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
答案 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内存,这应该不是问题。