off文件的格式(完善)

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);
}

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值