zoukankan      html  css  js  c++  java
  • 3D文件压缩库——Draco简析

    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
    • 1

    结果如下:

    Encoder options:
      Compression level = 5
      Positions: Quantization = 14 bits
      Texture coordinates: Quantization = 12 bits
      Normals: Quantization = 10 bits
    
    Encoded 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文件包含顶点信息和面的信息。 
    这两者的联系如图所示: 
    Mesh
    顶点信息就是该点的物体坐标、法线向量、纹理坐标等,如果绑定了骨骼,还有各块骨骼的权重。 
    面的信息指怎么由顶点围成面,它是一系列顶点索引的集合。如 f1: 0,1,2 表示由 x0, x1, x2 三个点围成一个面。

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

    流程与算法

    这里只列obj文件格式的编码流程图: 
    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相关的资源大头(图片)还是一个老大难的问题。

    版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/jxt1234and2010 http://blog.csdn.net/jxt1234and2010/article/details/53999155
  • 相关阅读:
    Bareword "mp4" not allowed while "strict subs" in use at (usersupplied code). ubuntu
    linux系统中如何删除空行
    linux系统中comm命令的用法
    Package libxml2.0 was not found in the pkgconfig search path
    ubuntu qt.qpa.xcb: could not connect to display
    R语言中管道运算符 %>%
    R语言中setdiff、intersect、union函数
    poly 定点于mesh定点的法线对其,非开做比较好,要是来回转很费时间, 界面还打伤元气
    rollout floater 界面的加减。
    看了脚本后才知道是怎么把三边转四边。
  • 原文地址:https://www.cnblogs.com/lst619247/p/8580637.html
Copyright © 2011-2022 走看看