1.off文件格式
Object File Format(off)文件通过描述物体表面的多边形来表示一个模型的几何结构。这些多边形可以包含任意数量的顶点。
1)off文件为ASCII文件,以OFF关键字开头
2)下一行是该模型的顶点数,面数和边数。边数可以忽略,对模型不会有影响(可以为0)
3)顶点以x,y,z坐标列出,每个顶点占一行
4)在顶点列表之后是面列表,每个面占一行。对于每个边,首先指定其包含的顶点数,随后是这个面所包含的各顶点在前面顶点列表中的索引
即以下格式:
OFF
顶点数 面数 边数
x y z
n个顶点 顶点1的索引 顶点2的索引 … 顶点n的索引
…
下面是一个立方体的例子:
OFF
8 6 0
-0.400000 -0.500000 0.500000
0.500000 -0.500000 0.500000
-0.500000 0.700000 0.500000
0.500000 0.500000 0.500000
-0.500000 0.500000 -0.500000
0.500000 0.500000 -0.800000
-0.500000 -0.500000 -0.500000
0.500000 -0.400000 -0.500000
4 0 1 3 2
4 2 3 5 4
4 4 5 7 6
4 6 7 1 0
4 1 7 5 3
4 6 0 2 4
#include <stdio.h>
#include <string>
#include <vector>
#include <Eigen/Eigen>
class Cube {
public:
int NVertices = 8;
int NFaces = 6;
int NEdges = 0;
std::vector<Eigen::Vector3d> Vertices;
std::vector<Eigen::Vector4i> NFaces;
void Init();
}
void Cube::Init() {
Vertices.resize(8);
Vertices[0] << -0.500000 -0.500000 0.500000;
Vertices[1] << 0.500000 -0.500000 0.500000;
Vertices[2] << -0.500000 0.500000 0.500000;
Vertices[3] << 0.500000 0.500000 0.500000;
Vertices[4] << -0.500000 0.500000 -0.500000;
Vertices[5] << 0.500000 0.500000 -0.500000;
Vertices[6] << -0.500000 -0.500000 -0.500000;
Vertices[7] << 0.500000 -0.500000 -0.500000;
Edges.resize(6);
Edges[0] << 0 1 3 2;
Edges[1] << 2 3 5 4;
Edges[2] << 4 5 7 6;
Edges[3] << 6 7 1 0;
Edges[4] << 1 7 5 3;
Edges[5] << 6 0 2 4;
}
int main() {
std::string off_file_path = "/home/alan/cube.off";
FILE *f = fopen(off_file_path.c_str(), "w");
if(f == nullptr){
std::cout << "Cannot open file: " << off_file_path;
}
Cube cube;
cube.Init();
fprintf(f, "COFF\n");
fprintf(f, "%d %d %d\n", cube.NVertices, cube.NFaces, cube.NEdges);
for (const auto& vertice : cube.Vertices) {
fprintf(f, "%lf %lf %lf %lf %lf %lf %lf\n",
vertice.x(), vertice.y(), vertice.z(), 0.8, 0.8, 0.8, 1.0); // 颜色信息(R,G,B,[A]),整数0~255或小数0.0~1.0
}
for (const auto& face : cube.NFaces) {
fprintf(f, "4 %d %d %d %d\n",
face[0], face[1], face[2], face[3]);
}
fclose(f);
}