OFF文件介绍
转载自:http://blog.sina.com.cn/s/blog_643634b80102v166.html
物体文件格式(.off)文件通过描述物体表面的多边形来表示一个模型的几何结构,这里的多边形可以有任意数量的顶点。
普林斯顿形状 Banchmark(Princeton Shape Benchmark)中的 .off 文件遵循以下标准:
OFF文件全是以OFF关键字开始的ASCII文件。
下一行说明顶点的数量、面片的数量、边的数量。边的数量可以安全地省略。
顶点按每行一个列出x、y、z坐标。
在顶点列表后,面片按照每行一个列表,对于每个面片,顶点的数量是指定的,接下来是顶点索引列表。
详见 一个立方体的简单例子 cube.off:
OFF
顶点数 面片数 边数
x y z
x y z
…
n个顶点 顶点1的索引 顶点2的索引 … 顶点n的索引
…
注意:顶点标号是从0开始(不是从1开始)的,边数总是0。
off文件中一个立方体文件的示例:
OFF
8 12 0
-0.274878 -0.274878 -0.274878
-0.274878 0.274878 -0.274878
0.274878 0.274878 -0.274878
0.274878 -0.274878 -0.274878
-0.274878 -0.274878 0.274878
-0.274878 0.274878 0.274878
0.274878 0.274878 0.274878
0.274878 -0.274878 0.274878
3 0 1 3
3 3 1 2
3 0 4 1
3 1 4 5
3 3 2 7
3 7 2 6
3 4 0 3
3 7 4 3
3 6 4 7
3 6 5 4
3 1 5 6
3 2 1 6
MATLAB中将离散数据写入OFF文件中
首先,我们需要建立该离散三维体数据的等值面:
% 建立等值面
fv = isosurface(V,0.5);
紧接着,在MATLAB中我们可以使用patch函数查看一下效果:
% 简单查看效果
p = patch(fv);
view(3);
下一步,我们就可以通过预先计算好的等值面的顶点和面片索引信息写入OFF文件中了:
% 文件写入
fid=fopen('result.off','w');
ND=size( fv.vertices,1);
NF=size(fv.faces,1);
NL=0;
fprintf(fid,'OFF\n');
fprintf(fid,'%d %d %d\n',ND,NF,NL);
for i=1:ND
fprintf(fid,'%d %d %d\n', fv.vertices(i,1)-1,fv.vertices(i,2)-1,fv.vertices(i,3)-1);
end
for i=1:NF
fprintf(fid,'%d %d %d %d\n',3,fv.faces(i,1)-1,fv.faces(i,2)-1,fv.faces(i,3)-1);
end
fclose(fid);
注意:代码中我们对所有的面片和顶点索引都减1,这是因为MATLAB中的索引从1开始。
总结
以上内容是我个人在实践中的总结,如有不对或者更好的方法请多多指教。