off文件的格式、写入和显示

一、介绍

物体文件格式(.off)文件用于表示给定了表面多边形的模型的几何体。这里的多边形可以有任意数量的顶点。

普林斯顿形状Banchmark中的.off文件遵循以下标准:

1、.off文件为ASCII文件,以OFF关键字开头。 

2、下一行是该模型的顶点数,面数和边数。边数可以忽略,对模型不会有影响(可以为0)。

3、顶点以x,y,z坐标列出,每个顶点占一行。

4、在顶点列表之后是面列表,每个面占一行。对于每个面,首先指定其包含的顶点数,随后是这个面所包含的各顶点在前面顶点列表中的索引。

即以下格式:

OFF

顶点数 面数 边数 
x y z
x y z
...

n个顶点 顶点1的索引 顶点2的索引 … 顶点n的索引
...

一个立方体的简单例子: 

COFF
8 6 0
-0.500000 -0.500000 0.500000
0.500000 -0.500000 0.500000
-0.500000 0.500000 0.500000
0.500000 0.500000 0.500000
-0.500000 0.500000 -0.500000
0.500000 0.500000 -0.500000
-0.500000 -0.500000 -0.500000
0.500000 -0.500000 -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);
}

三、显示

安装MeshLab:

sudo apt-get install meshlab

用MeshLab打开(双击.off文件或将.off文件拖拽到MeshLab中)

参考:

http://shape.cs.princeton.edu/benchmark/documentation/off_format.html

http://segeval.cs.princeton.edu/public/off_format.html

http://www.geomview.org/docs/html/OFF.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值