3D文件压缩库——Draco简析
此文转自: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简析相关推荐
- 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.3节简析Android安装文件...
本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.3节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...
- 《Android多媒体应用开发实战详解:图像、音频、视频、2D和3D》——2.1节简析Android安装文件...
本节书摘来自异步社区<Android多媒体应用开发实战详解:图像.音频.视频.2D和3D>一书中的第2章,第2.1节简析Android安装文件,作者 王石磊 , 吴峥,更多章节内容可以访问 ...
- android文件压缩库,Android文件压缩和解压
Android文件压缩和解压 Java代码 package com.maidong.utils; import java.io.BufferedInputStream; import java.io. ...
- 3D打印Gcode命令指令简析
*G0:快速移动 *G1:控制移动 坐标轴XYZE移动控制(G0和G1一样) 例子:G0 F2000 X30 Y30 Z30 E3 *G2:顺时针画弧 *G3:逆时针画弧 此命令有两种形式:IJ-fo ...
- 【Python基础】turtle库语法简析!
目录 一.概述 二.库引用与import 2.1 库引用 2.2 使用from和import保留字共同完成库引用 2.3 两种库引用方法比较 2.4 使用import和as保留字共同完成库引用 三.t ...
- (Ajax)axios源码简析(三)——请求与取消请求
传送门: axios源码简析(一)--axios入口文件 axios源码简析(二)--Axios类与拦截器 axios源码简析(三)--请求与取消请求 请求过程 在Axios.prototype.re ...
- 基于libmad库的MP3解码简析
基于libmad库的MP3解码简析 MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3). ...
- 静态库调用_静态链接和动态链接对比简析
0. 简介 在Linux环境下进行开发工作,代码要经过编译链接生成二进制可执行文件,才能被CPU识别并执行:程序的编译过程可以参考另外一篇文章<linux程序编译过程简析>:链接过程分为两 ...
- Linux 动态链接和静态链接简析(库名与库文件名)
原文请见 Linux动态链接和静态链接简析 0. 库名与真正的库文件名 就拿数学库来说,他的库名是 m,他的库文件名是libm.so,很容易看出,把库文件名的头 lib 和尾.so去掉就是库名.(gc ...
- linux安装最新版的glib库,GLib库安装与简析
GLib是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库, 它提供C语言的常用的数据结构的定义.相关的处理函数,有趣而实用的宏, 可移植的封装和一些运行时机能,如 ...
最新文章
- 网站网页编写需要注意哪些问题?
- HTML DOM 第五篇
- (J2EE学习笔记)解决Hibernate删除异常:deleted object would be re-saved by cascade
- ASP.NET Core Web 项目文件介绍
- 计算机网络ppt_大学四年,我这样学操作系统和计算机网络,毕业后成为了别人眼中的大神(附书籍推荐)
- 安装浏览器的vue插件
- canvas学习(四):高级属性
- 杰里之AC897N_AD697N_earphone_release_ V2.0.1 开立体声左右声道数据对调【篇】
- ubuntu14.04 + dlib19.2+【 C++ 】+Face Landmark Detection
- Industry personnel quality of foam mixer is high
- Aspose.word设置页眉
- Git还能这样玩?居然被他玩出了新花样
- fastnest怎么一键排版_我的妈呀!一键排版也太好用了吧!3秒钟搞定排版!
- 2020-11-01(电脑耳机声音外放)
- Scratch软件编程等级考试四级——20200620
- Java 性能优化实战工具实践:如何获取代码性能数据?
- Wattagio for Mac(Mac电池管理软件)v1.12.11
- Unity插件学习(五) ------ 本地存储Easy Save3
- ITX-3568JQ四核ITX工业级主板
- 椭圆曲线密码体制(ECC)
热门文章
- 基于I2C协议的AHT20温湿度传感器的数据采集及OLED屏显示
- 树的中序遍历(递归,迭代,莫里斯)
- shopex mysql索引_shopex站点迁移或复制基本步骤及问题解决
- 大二暑假立秋学习总结
- 0x80004005错误代码解决方法,哪种方法快捷有效?
- 基于RFID和ZigBee室内定位技术原理浅析--室内定位--蓝牙定位--新导智能
- 数字化会议管理系统,实现会议全流程管理
- Java的求学之路--Day01
- .NET 6 中的 Http Logging 中间件
- ssm + layui + poi+ 自定义注解 + java反射 做条件导出Excel 工具类