此文转自:https://blog.csdn.net/jxt1234and2010/article/details/53999155

3D文件压缩库——Draco简析

今年1月份时,google发布了名为“Draco”的3D图形开源压缩库,下载了其代码来看了下,感觉虽然暂时用不到,但还是有前途的,故简单做下分析。

注:Draco 代码地址:
https://github.com/google/draco

基本使用

编译

cmake . + make 编译源码,生成 draco_encoder 和 draco_decoder 两个可执行文件

编码/压缩

使用 draco_encoder 压缩 obj 或 ply 的文件:

./draco_encoder -i torusknot.obj

结果如下:

Encoder options:Compression level = 5Positions: Quantization = 14 bitsTexture coordinates: Quantization = 12 bitsNormals: Quantization = 10 bitsEncoded mesh saved to torusknot.obj.drc (3 ms to encode)Encoded size = 2272 bytes

(1)Compression level:这个决定后续选用什么算法进行压缩,值越高,速度越慢,压缩效果越好。
(2)Positions: Quantization = 14 bits:顶点属性值是由浮点转换为整数再编码的,14位表示用(1<<14)(即2的14次方)去乘浮点数,然后取整。

解码

./draco_decoder -i torusknot.obj.drc -o torusknot.obj

这里必须指定obj的输出文件,不然会解成ply格式,这样 面 的信息就没了。

原理

3D文件格式

一个3D模型文件,一般包含顶点、面、材质、动画等各种引擎渲染所需要的信息。
ply文件格式只包含顶点信息,而obj文件包含顶点信息和面的信息。
这两者的联系如图所示:

顶点信息就是该点的物体坐标、法线向量、纹理坐标等,如果绑定了骨骼,还有各块骨骼的权重。
面的信息指怎么由顶点围成面,它是一系列顶点索引的集合。如 f1: 0,1,2 表示由 x0, x1, x2 三个点围成一个面。

但这两种格式都不满足3D项目的需求,我们所用的模型文件还需要材质信息,动画信息等,因此在项目中想用draco,必须将其改造一下。

流程与算法

这里只列obj文件格式的编码流程图:

这里面采用的是如下文献的算法:
http://www.cc.gatech.edu/~jarek/papers/CornerTableSMI.pdf
它用 edge breaker 算法去压缩面的信息,并产生 CornerTable,用平行四边形差分方式压缩顶点属性信息。

Draco 里面还有其他的压缩顶点属性值的算法,如kd-tree、差分等,详细见各种 PredictionScheme,不多述。

Draco作用

1、Draco 在当前的VR、AR生态下,基本上没有直接使用的价值,想用它必须理解原理并修改源码。
2、Draco 里面有比较好的mesh压缩方案,有利于游戏引擎公司基于该代码优化自己的模型设计。
3、Draco 所能压缩的只是3D模型文件中的一部分,而3D相关的资源大头(图片)还是一个老大难的问题。

3D文件压缩库——Draco简析相关推荐

  1. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.3节简析Android安装文件...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.3节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...

  2. 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.1节简析Android安装文件...

    本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.1节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...

  3. android文件压缩库,Android文件压缩和解压

    Android文件压缩和解压 Java代码 package com.maidong.utils; import java.io.BufferedInputStream; import java.io. ...

  4. 3D打印Gcode命令指令简析

    *G0:快速移动 *G1:控制移动 坐标轴XYZE移动控制(G0和G1一样) 例子:G0 F2000 X30 Y30 Z30 E3 *G2:顺时针画弧 *G3:逆时针画弧 此命令有两种形式:IJ-fo ...

  5. 【Python基础】turtle库语法简析!

    目录 一.概述 二.库引用与import 2.1 库引用 2.2 使用from和import保留字共同完成库引用 2.3 两种库引用方法比较 2.4 使用import和as保留字共同完成库引用 三.t ...

  6. (Ajax)axios源码简析(三)——请求与取消请求

    传送门: axios源码简析(一)--axios入口文件 axios源码简析(二)--Axios类与拦截器 axios源码简析(三)--请求与取消请求 请求过程 在Axios.prototype.re ...

  7. 基于libmad库的MP3解码简析

    基于libmad库的MP3解码简析  MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3). ...

  8. 静态库调用_静态链接和动态链接对比简析

    0. 简介 在Linux环境下进行开发工作,代码要经过编译链接生成二进制可执行文件,才能被CPU识别并执行:程序的编译过程可以参考另外一篇文章<linux程序编译过程简析>:链接过程分为两 ...

  9. Linux 动态链接和静态链接简析(库名与库文件名)

    原文请见 Linux动态链接和静态链接简析 0. 库名与真正的库文件名 就拿数学库来说,他的库名是 m,他的库文件名是libm.so,很容易看出,把库文件名的头 lib 和尾.so去掉就是库名.(gc ...

  10. linux安装最新版的glib库,GLib库安装与简析

    GLib是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库, 它提供C语言的常用的数据结构的定义.相关的处理函数,有趣而实用的宏, 可移植的封装和一些运行时机能,如 ...

最新文章

  1. 网站网页编写需要注意哪些问题?
  2. HTML DOM 第五篇
  3. (J2EE学习笔记)解决Hibernate删除异常:deleted object would be re-saved by cascade
  4. ASP.NET Core Web 项目文件介绍
  5. 计算机网络ppt_大学四年,我这样学操作系统和计算机网络,毕业后成为了别人眼中的大神(附书籍推荐)
  6. 安装浏览器的vue插件
  7. canvas学习(四):高级属性
  8. 杰里之AC897N_AD697N_earphone_release_ V2.0.1 开立体声左右声道数据对调【篇】
  9. ubuntu14.04 + dlib19.2+【 C++ 】+Face Landmark Detection
  10. Industry personnel quality of foam mixer is high
  11. Aspose.word设置页眉
  12. Git还能这样玩?居然被他玩出了新花样
  13. fastnest怎么一键排版_我的妈呀!一键排版也太好用了吧!3秒钟搞定排版!
  14. 2020-11-01(电脑耳机声音外放)
  15. Scratch软件编程等级考试四级——20200620
  16. Java 性能优化实战工具实践:如何获取代码性能数据?
  17. Wattagio for Mac(Mac电池管理软件)v1.12.11
  18. Unity插件学习(五) ------ 本地存储Easy Save3
  19. ITX-3568JQ四核ITX工业级主板
  20. 椭圆曲线密码体制(ECC)

热门文章

  1. 基于I2C协议的AHT20温湿度传感器的数据采集及OLED屏显示
  2. 树的中序遍历(递归,迭代,莫里斯)
  3. shopex mysql索引_shopex站点迁移或复制基本步骤及问题解决
  4. 大二暑假立秋学习总结
  5. 0x80004005错误代码解决方法,哪种方法快捷有效?
  6. 基于RFID和ZigBee室内定位技术原理浅析--室内定位--蓝牙定位--新导智能
  7. 数字化会议管理系统,实现会议全流程管理
  8. Java的求学之路--Day01
  9. .NET 6 中的 Http Logging 中间件
  10. ssm + layui + poi+ 自定义注解 + java反射 做条件导出Excel 工具类