(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
Draco是一个开源的Lib库,提供3D图形mesh和点云的压缩和解压。它的目标是提升3D图形的存储和传输效率。
Draco is an open-source library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.https://google.github.io/draco/
git路径: https://github.com/google/draco
Draco提供了针对性mesh压缩的算法,可以提供比gzip压缩更有针对性的压缩。
缺省支持了OBJ和PLY文件类型的压缩,其它格式的文件需要通过程序进行封装,并调用接口库进行压缩解压使用。
Draco提供的程序库文件有:
draco.lib
dracodec.lib
dracoenc.lib
draco_decoder.exe
draco_encoder.exe
如果输出的是obj/ply文件,
对于非obj格式,需要写相关的格式压缩处理,调用接口:
#include "draco/compression/encode.h"
#include "draco/core/encoder_buffer.h"
// init encoder
draco::Encoder encoder;
encoder.SetSpeedOptions(7, 7);
encoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION, 14);
encoder.SetAttributeQuantization(draco::GeometryAttribute::COLOR, 12);
encoder.SetAttributeQuantization(draco::GeometryAttribute::NORMAL, 10);
encoder.SetAttributeQuantization(draco::GeometryAttribute::TEX_COORD, 12);
encoder.SetAttributeQuantization(draco::GeometryAttribute::GENERIC, 12);
// init mesh
draco::Mesh mesh;
... put mesh info into draco mesh
// encode mesh to buffer
draco::EncoderBuffer buffer;
const draco::Status status = encoder.EncodeMeshToBuffer(mesh, &buffer);
// write buffer to file
...
out_file.write(buffer.data(), buffer.size())
c. mesh加载方法
参考Draco源码中 ObjDecoder::DecodeInternal 中的实现
// 1. 设置三角形
mesh->SetNumFaces
// 逐个设置三角形的index值
mesh->SetFace
// 2. 设置点的数量
point->set_num_points
// 3. 定义VBO相关属性
// 定义attribute, 把vertex/texcoor/normal/color放入attribute
GeometryAttribute geoAttr;
geoAttr.Init(GeometryAttribute::POSITION, nullptr, ...)
int attrid = mesh->AddAttribute(geoAttr...)
mesh.attribute(attrid)-SetAttributeValue(draco::AttributeValueIndex(i), value)
注意:
使用Draco的好处:
使用Draco的缺憾:
(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)