比特派(bitpie)钱包app官方下载|draco

比特派(bitpie)钱包app官方下载 2024-03-07 18:21:00

GitHub - google/draco: Draco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.

GitHub - google/draco: Draco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.

Skip to content

Toggle navigation

Sign in

Product

Actions

Automate any workflow

Packages

Host and manage packages

Security

Find and fix vulnerabilities

Codespaces

Instant dev environments

Copilot

Write better code with AI

Code review

Manage code changes

Issues

Plan and track work

Discussions

Collaborate outside of code

Explore

All features

Documentation

GitHub Skills

Blog

Solutions

For

Enterprise

Teams

Startups

Education

By Solution

CI/CD & Automation

DevOps

DevSecOps

Resources

Learning Pathways

White papers, Ebooks, Webinars

Customer Stories

Partners

Open Source

GitHub Sponsors

Fund open source developers

The ReadME Project

GitHub community articles

Repositories

Topics

Trending

Collections

Pricing

Search or jump to...

Search code, repositories, users, issues, pull requests...

Search

Clear

Search syntax tips

Provide feedback

We read every piece of feedback, and take your input very seriously.

Include my email address so I can be contacted

Cancel

Submit feedback

Saved searches

Use saved searches to filter your results more quickly

Name

Query

To see all available qualifiers, see our documentation.

Cancel

Create saved search

Sign in

Sign up

You signed in with another tab or window. Reload to refresh your session.

You signed out in another tab or window. Reload to refresh your session.

You switched accounts on another tab or window. Reload to refresh your session.

Dismiss alert

google

/

draco

Public

Notifications

Fork

920

Star

6.2k

Draco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.

google.github.io/draco/

License

Apache-2.0 license

6.2k

stars

920

forks

Branches

Tags

Activity

Star

Notifications

Code

Issues

105

Pull requests

16

Actions

Projects

0

Security

Insights

Additional navigation options

Code

Issues

Pull requests

Actions

Projects

Security

Insights

google/draco

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

 mainBranchesTagsGo to fileCodeFolders and filesNameNameLast commit messageLast commit dateLatest commit History619 Commits.github/workflows.github/workflows  cmakecmake  docsdocs  javascriptjavascript  mayamaya  src/dracosrc/draco  testdatatestdata  third_partythird_party  unityunity  .clang-format.clang-format  .cmake-format.py.cmake-format.py  .gitattributes.gitattributes  .gitignore.gitignore  .gitmodules.gitmodules  AUTHORSAUTHORS  BUILDING.mdBUILDING.md  CMAKE.mdCMAKE.md  CMakeLists.txtCMakeLists.txt  CONTRIBUTING.mdCONTRIBUTING.md  LICENSELICENSE  README.mdREADME.md  View all filesRepository files navigationREADMECode of conductApache-2.0 licenseSecurity

News

Attention GStatic users: the Draco team strongly recommends using the versioned

URLs for accessing Draco GStatic content. If you are using the URLs that include

the v1/decoders substring within the URL, edge caching and GStatic propagation

delays can result in transient errors that can be difficult to diagnose when

new Draco releases are launched. To avoid the issue pin your sites to a

versioned release.

Version 1.5.7 release:

Using the versioned www.gstatic.com WASM and Javascript decoders continues

to be recommended. To use v1.5.7, use this URL:

https://www.gstatic.com/draco/versioned/decoders/1.5.7/*

Added support for normalized attributes to Emscripten encoder API.

Bug fixes.

Security fixes.

Version 1.5.6 release:

Using the versioned www.gstatic.com WASM and Javascript decoders continues

to be recommended. To use v1.5.6, use this URL:

https://www.gstatic.com/draco/versioned/decoders/1.5.6/*

The CMake flag DRACO_DEBUG_MSVC_WARNINGS has been replaced with

DRACO_DEBUG_COMPILER_WARNINGS, and the behavior has changed. It is now a

boolean flag defined in draco_options.cmake.

Bug fixes.

Security fixes.

Version 1.5.5 release:

Using the versioned www.gstatic.com WASM and Javascript decoders continues

to be recommended. To use v1.5.5, use this URL:

https://www.gstatic.com/draco/versioned/decoders/1.5.5/*

Bug fix: #935

Version 1.5.4 release:

Using the versioned www.gstatic.com WASM and Javascript decoders continues

to be recommended. To use v1.5.4, use this URL:

https://www.gstatic.com/draco/versioned/decoders/1.5.4/*

Added partial support for glTF extensions EXT_mesh_features and

EXT_structural_metadata.

Bug fixes.

Security fixes.

Version 1.5.3 release:

Using the versioned www.gstatic.com WASM and Javascript decoders continues

to be recommended. To use v1.5.3, use this URL:

https://www.gstatic.com/draco/versioned/decoders/1.5.3/*

Bug fixes.

Version 1.5.2 release

This is the same as v1.5.1 with the following two bug fixes:

Fixes DRACO_TRANSCODER_SUPPORTED enabled builds.

ABI version updated.

Version 1.5.1 release

Adds assertion enabled Emscripten builds to the release, and a subset of the

assertion enabled builds to GStatic. See the file listing below.

Custom paths to third party dependencies are now supported. See BUILDING.md

for more information.

The CMake configuration file draco-config.cmake is now tested and known to

work for using Draco in Linux, MacOS, and Windows CMake projects. See the

install_test subdirectory of src/draco/tools for more information.

Bug fixes.

Version 1.5.0 release

Adds the draco_transcoder tool. See the section below on the glTF transcoding

tool, and BUILDING.md for build and dependency information.

Some changes to configuration variables have been made for this release:

The DRACO_GLTF flag has been renamed to DRACO_GLTF_BITSTREAM to help

increase understanding of its purpose, which is to limit Draco features to

those included in the Draco glTF specification.

Variables exported in CMake via draco-config.cmake and find-draco.cmake

(formerly FindDraco.cmake) have been renamed. It's unlikely that this

impacts any existing projects as the aforementioned files were not formed

correctly. See PR775 for full

details of the changes.

A CMake version file has been added.

The CMake install target now uses absolute paths direct from CMake instead

of building them using CMAKE_INSTALL_PREFIX. This was done to make Draco

easier to use for downstream packagers and should have little to no impact on

users picking up Draco from source.

Certain MSVC warnings have had their levels changed via compiler flag to

reduce the amount of noise output by the MSVC compilers. Set MSVC warning

level to 4, or define DRACO_DEBUG_MSVC_WARNINGS at CMake configuration time

to restore previous behavior.

Bug fixes.

Version 1.4.3 release

Using the versioned www.gstatic.com WASM and Javascript decoders continues

to be recommended. To use v1.4.3, use this URL:

https://www.gstatic.com/draco/versioned/decoders/1.4.3/*

Bug fixes

Version 1.4.1 release

Using the versioned www.gstatic.com WASM and Javascript decoders is now

recommended. To use v1.4.1, use this URL:

https://www.gstatic.com/draco/versioned/decoders/1.4.1/*

Replace the * with the files to load. E.g.

https://www.gstatic.com/draco/versioned/decoders/1.4.1/draco_decoder.js

This works with the v1.3.6 and v1.4.0 releases, and will work with future

Draco releases.

Bug fixes

Version 1.4.0 release

WASM and JavaScript decoders are hosted from a static URL.

It is recommended to always pull your Draco WASM and JavaScript decoders from this URL:

https://www.gstatic.com/draco/v1/decoders/*

Replace * with the files to load. E.g.

https://www.gstatic.com/draco/v1/decoders/draco_decoder_gltf.wasm

Users will benefit from having the Draco decoder in cache as more sites start using the static URL

Changed npm modules to use WASM, which increased performance by ~200%.

Updated Emscripten to 2.0.

This causes the Draco codec modules to return a promise instead of the module directly.

Please see the example code on how to handle the promise.

Changed NORMAL quantization default to 8.

Added new array API to decoder and deprecated DecoderBuffer.

See PR #513 for more information.

Changed WASM/JavaScript behavior of catching exceptions.

See issue #629 for more information.

Code cleanup.

Emscripten builds now disable NODEJS_CATCH_EXIT and NODEJS_CATCH_REJECTION.

Authors of a CLI tool might want to add their own error handlers.

Added Maya plugin builds.

Unity plugin builds updated.

Builds are now stored as archives.

Added iOS build.

Unity users may want to look into https://github.com/atteneder/DracoUnity.

Bug fixes.

Version 1.3.6 release

WASM and JavaScript decoders are now hosted from a static URL

It is recommended to always pull your Draco WASM and JavaScript decoders from this URL:

https://www.gstatic.com/draco/v1/decoders/*

Replace * with the files to load. E.g.

https://www.gstatic.com/draco/v1/decoders/draco_decoder_gltf.wasm

Users will benefit from having the Draco decoder in cache as more sites start using the static URL

Changed web examples to pull Draco decoders from static URL

Added new API to Draco WASM decoder, which increased performance by ~15%

Decreased Draco WASM decoder size by ~20%

Added support for generic and multiple attributes to Draco Unity plug-ins

Added new API to Draco Unity, which increased decoder performance by ~15%

Changed quantization defaults:

POSITION: 11

NORMAL: 7

TEX_COORD: 10

COLOR: 8

GENERIC: 8

Code cleanup

Bug fixes

Version 1.3.5 release

Added option to build Draco for Universal Scene Description

Code cleanup

Bug fixes

Version 1.3.4 release

Released Draco Animation code

Fixes for Unity

Various file location and name changes

Version 1.3.3 release

Added ExpertEncoder to the Javascript API

Allows developers to set quantization options per attribute id

Bug fixes

Version 1.3.2 release

Bug fixes

Version 1.3.1 release

Fix issue with multiple attributes when skipping an attribute transform

Version 1.3.0 release

Improved kD-tree based point cloud encoding

Now applicable to point clouds with any number of attributes

Support for all integer attribute types and quantized floating point types

Improved mesh compression up to 10% (on average ~2%)

For meshes, the 1.3.0 bitstream is fully compatible with 1.2.x decoders

Improved Javascript API

Added support for all signed and unsigned integer types

Added support for point clouds to our Javascript encoder API

Added support for integer properties to the PLY decoder

Bug fixes

Previous releases

https://github.com/google/draco/releases

Description

Draco is a library for compressing and decompressing 3D geometric meshes and

point clouds. It is intended to improve the storage and transmission of 3D

graphics.

Draco was designed and built for compression efficiency and speed. The code

supports compressing points, connectivity information, texture coordinates,

color information, normals, and any other generic attributes associated with

geometry. With Draco, applications using 3D graphics can be significantly

smaller without compromising visual fidelity. For users, this means apps can

now be downloaded faster, 3D graphics in the browser can load quicker, and VR

and AR scenes can now be transmitted with a fraction of the bandwidth and

rendered quickly.

Draco is released as C++ source code that can be used to compress 3D graphics

as well as C++ and Javascript decoders for the encoded data.

Contents

Building

Usage

Unity

WASM and JavaScript Decoders

Command Line Applications

Encoding Tool

Encoding Point Clouds

Decoding Tool

glTF Transcoding Tool

C++ Decoder API

Javascript Encoder API

Javascript Decoder API

Javascript Decoder Performance

Metadata API

NPM Package

three.js Renderer Example

GStatic Javascript Builds

Support

License

References

Building

See BUILDING for building instructions.

Usage

Unity

For the best information about using Unity with Draco please visit https://github.com/atteneder/DracoUnity

For a simple example of using Unity with Draco see README in the unity folder.

WASM and JavaScript Decoders

It is recommended to always pull your Draco WASM and JavaScript decoders from:

https://www.gstatic.com/draco/v1/decoders/

Users will benefit from having the Draco decoder in cache as more sites start using the static URL.

Command Line Applications

The default target created from the build files will be the draco_encoder

and draco_decoder command line applications. Additionally, draco_transcoder

is generated when CMake is run with the DRACO_TRANSCODER_SUPPORTED variable set

to ON (see BUILDING for more details). For all

applications, if you run them without any arguments or -h, the applications

will output usage and options.

Encoding Tool

draco_encoder will read OBJ, STL or PLY files as input, and output

Draco-encoded files. We have included Stanford's Bunny mesh for testing. The

basic command line looks like this:

./draco_encoder -i testdata/bun_zipper.ply -o out.drc

A value of 0 for the quantization parameter will not perform any quantization

on the specified attribute. Any value other than 0 will quantize the input

values for the specified attribute to that number of bits. For example:

./draco_encoder -i testdata/bun_zipper.ply -o out.drc -qp 14

will quantize the positions to 14 bits (default is 11 for the position

coordinates).

In general, the more you quantize your attributes the better compression rate

you will get. It is up to your project to decide how much deviation it will

tolerate. In general, most projects can set quantization values of about 11

without any noticeable difference in quality.

The compression level (-cl) parameter turns on/off different compression

features.

./draco_encoder -i testdata/bun_zipper.ply -o out.drc -cl 8

In general, the highest setting, 10, will have the most compression but

worst decompression speed. 0 will have the least compression, but best

decompression speed. The default setting is 7.

Encoding Point Clouds

You can encode point cloud data with draco_encoder by specifying the

-point_cloud parameter. If you specify the -point_cloud parameter with a

mesh input file, draco_encoder will ignore the connectivity data and encode

the positions from the mesh file.

./draco_encoder -point_cloud -i testdata/bun_zipper.ply -o out.drc

This command line will encode the mesh input as a point cloud, even though the

input might not produce compression that is representative of other point

clouds. Specifically, one can expect much better compression rates for larger

and denser point clouds.

Decoding Tool

draco_decoder will read Draco files as input, and output OBJ, STL or PLY

files. The basic command line looks like this:

./draco_decoder -i in.drc -o out.obj

glTF Transcoding Tool

draco_transcoder can be used to add Draco compression to glTF assets. The

basic command line looks like this:

./draco_transcoder -i in.glb -o out.glb

This command line will add geometry compression to all meshes in the in.glb

file. Quantization values for different glTF attributes can be specified

similarly to the draco_encoder tool. For example -qp can be used to define

quantization of the position attribute:

./draco_transcoder -i in.glb -o out.glb -qp 12

C++ Decoder API

If you'd like to add decoding to your applications you will need to include

the draco_dec library. In order to use the Draco decoder you need to

initialize a DecoderBuffer with the compressed data. Then call

DecodeMeshFromBuffer() to return a decoded mesh object or call

DecodePointCloudFromBuffer() to return a decoded PointCloud object. For

example:

draco::DecoderBuffer buffer;

buffer.Init(data.data(), data.size());

const draco::EncodedGeometryType geom_type =

draco::GetEncodedGeometryType(&buffer);

if (geom_type == draco::TRIANGULAR_MESH) {

unique_ptr mesh = draco::DecodeMeshFromBuffer(&buffer);

} else if (geom_type == draco::POINT_CLOUD) {

unique_ptr pc = draco::DecodePointCloudFromBuffer(&buffer);

}

Please see src/draco/mesh/mesh.h for the full Mesh class interface and

src/draco/point_cloud/point_cloud.h for the full PointCloud class interface.

Javascript Encoder API

The Javascript encoder is located in javascript/draco_encoder.js. The encoder

API can be used to compress mesh and point cloud. In order to use the encoder,

you need to first create an instance of DracoEncoderModule. Then use this

instance to create MeshBuilder and Encoder objects. MeshBuilder is used

to construct a mesh from geometry data that could be later compressed by

Encoder. First create a mesh object using new encoderModule.Mesh() . Then,

use AddFacesToMesh() to add indices to the mesh and use

AddFloatAttributeToMesh() to add attribute data to the mesh, e.g. position,

normal, color and texture coordinates. After a mesh is constructed, you could

then use EncodeMeshToDracoBuffer() to compress the mesh. For example:

const mesh = {

indices : new Uint32Array(indices),

vertices : new Float32Array(vertices),

normals : new Float32Array(normals)

};

const encoderModule = DracoEncoderModule();

const encoder = new encoderModule.Encoder();

const meshBuilder = new encoderModule.MeshBuilder();

const dracoMesh = new encoderModule.Mesh();

const numFaces = mesh.indices.length / 3;

const numPoints = mesh.vertices.length;

meshBuilder.AddFacesToMesh(dracoMesh, numFaces, mesh.indices);

meshBuilder.AddFloatAttributeToMesh(dracoMesh, encoderModule.POSITION,

numPoints, 3, mesh.vertices);

if (mesh.hasOwnProperty('normals')) {

meshBuilder.AddFloatAttributeToMesh(

dracoMesh, encoderModule.NORMAL, numPoints, 3, mesh.normals);

}

if (mesh.hasOwnProperty('colors')) {

meshBuilder.AddFloatAttributeToMesh(

dracoMesh, encoderModule.COLOR, numPoints, 3, mesh.colors);

}

if (mesh.hasOwnProperty('texcoords')) {

meshBuilder.AddFloatAttributeToMesh(

dracoMesh, encoderModule.TEX_COORD, numPoints, 3, mesh.texcoords);

}

if (method === "edgebreaker") {

encoder.SetEncodingMethod(encoderModule.MESH_EDGEBREAKER_ENCODING);

} else if (method === "sequential") {

encoder.SetEncodingMethod(encoderModule.MESH_SEQUENTIAL_ENCODING);

}

const encodedData = new encoderModule.DracoInt8Array();

// Use default encoding setting.

const encodedLen = encoder.EncodeMeshToDracoBuffer(dracoMesh,

encodedData);

encoderModule.destroy(dracoMesh);

encoderModule.destroy(encoder);

encoderModule.destroy(meshBuilder);

Please see src/draco/javascript/emscripten/draco_web_encoder.idl for the full API.

Javascript Decoder API

The Javascript decoder is located in javascript/draco_decoder.js. The

Javascript decoder can decode mesh and point cloud. In order to use the

decoder, you must first create an instance of DracoDecoderModule. The

instance is then used to create DecoderBuffer and Decoder objects. Set

the encoded data in the DecoderBuffer. Then call GetEncodedGeometryType()

to identify the type of geometry, e.g. mesh or point cloud. Then call either

DecodeBufferToMesh() or DecodeBufferToPointCloud(), which will return

a Mesh object or a point cloud. For example:

// Create the Draco decoder.

const decoderModule = DracoDecoderModule();

const buffer = new decoderModule.DecoderBuffer();

buffer.Init(byteArray, byteArray.length);

// Create a buffer to hold the encoded data.

const decoder = new decoderModule.Decoder();

const geometryType = decoder.GetEncodedGeometryType(buffer);

// Decode the encoded geometry.

let outputGeometry;

let status;

if (geometryType == decoderModule.TRIANGULAR_MESH) {

outputGeometry = new decoderModule.Mesh();

status = decoder.DecodeBufferToMesh(buffer, outputGeometry);

} else {

outputGeometry = new decoderModule.PointCloud();

status = decoder.DecodeBufferToPointCloud(buffer, outputGeometry);

}

// You must explicitly delete objects created from the DracoDecoderModule

// or Decoder.

decoderModule.destroy(outputGeometry);

decoderModule.destroy(decoder);

decoderModule.destroy(buffer);

Please see src/draco/javascript/emscripten/draco_web_decoder.idl for the full API.

Javascript Decoder Performance

The Javascript decoder is built with dynamic memory. This will let the decoder

work with all of the compressed data. But this option is not the fastest.

Pre-allocating the memory sees about a 2x decoder speed improvement. If you

know all of your project's memory requirements, you can turn on static memory

by changing CMakeLists.txt accordingly.

Metadata API

Starting from v1.0, Draco provides metadata functionality for encoding data

other than geometry. It could be used to encode any custom data along with the

geometry. For example, we can enable metadata functionality to encode the name

of attributes, name of sub-objects and customized information.

For one mesh and point cloud, it can have one top-level geometry metadata class.

The top-level metadata then can have hierarchical metadata. Other than that,

the top-level metadata can have metadata for each attribute which is called

attribute metadata. The attribute metadata should be initialized with the

correspondent attribute id within the mesh. The metadata API is provided both

in C++ and Javascript.

For example, to add metadata in C++:

draco::PointCloud pc;

// Add metadata for the geometry.

std::unique_ptr metadata =

std::unique_ptr(new draco::GeometryMetadata());

metadata->AddEntryString("description", "This is an example.");

pc.AddMetadata(std::move(metadata));

// Add metadata for attributes.

draco::GeometryAttribute pos_att;

pos_att.Init(draco::GeometryAttribute::POSITION, nullptr, 3,

draco::DT_FLOAT32, false, 12, 0);

const uint32_t pos_att_id = pc.AddAttribute(pos_att, false, 0);

std::unique_ptr pos_metadata =

std::unique_ptr(

new draco::AttributeMetadata(pos_att_id));

pos_metadata->AddEntryString("name", "position");

// Directly add attribute metadata to geometry.

// You can do this without explicitly add |GeometryMetadata| to mesh.

pc.AddAttributeMetadata(pos_att_id, std::move(pos_metadata));

To read metadata from a geometry in C++:

// Get metadata for the geometry.

const draco::GeometryMetadata *pc_metadata = pc.GetMetadata();

// Request metadata for a specific attribute.

const draco::AttributeMetadata *requested_pos_metadata =

pc.GetAttributeMetadataByStringEntry("name", "position");

Please see src/draco/metadata and src/draco/point_cloud for the full API.

NPM Package

Draco NPM NodeJS package is located in javascript/npm/draco3d. Please see the

doc in the folder for detailed usage.

three.js Renderer Example

Here's an example of a geometric compressed with Draco loaded via a

Javascript decoder using the three.js renderer.

Please see the javascript/example/README.md file for more information.

GStatic Javascript Builds

Prebuilt versions of the Emscripten-built Draco javascript decoders are hosted

on www.gstatic.com in version labeled directories:

https://www.gstatic.com/draco/versioned/decoders/VERSION/*

As of the v1.4.3 release the files available are:

draco_decoder.js

draco_decoder.wasm

draco_decoder_gltf.js

draco_decoder_gltf.wasm

draco_wasm_wrapper.js

draco_wasm_wrapper_gltf.js

Beginning with the v1.5.1 release assertion enabled builds of the following

files are available:

draco_decoder.js

draco_decoder.wasm

draco_wasm_wrapper.js

Support

For questions/comments please email draco-3d-discuss@googlegroups.com

If you have found an error in this library, please file an issue at

https://github.com/google/draco/issues

Patches are encouraged, and may be submitted by forking this project and

submitting a pull request through GitHub. See CONTRIBUTING for more detail.

License

Licensed under the Apache License, Version 2.0 (the "License"); you may not

use this file except in compliance with the License. You may obtain a copy of

the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS, WITHOUT

WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

License for the specific language governing permissions and limitations under

the License.

References

Bunny model from Stanford's graphic department https://graphics.stanford.edu/data/3Dscanrep/

About

Draco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.

google.github.io/draco/

Topics

compression

point-cloud

mesh

3d-graphics

Resources

Readme

License

Apache-2.0 license

Code of conduct

Code of conduct

Security policy

Security policy

Activity

Custom properties

Stars

6.2k

stars

Watchers

220

watching

Forks

920

forks

Report repository

Releases

26

Draco 1.5.7 release

Latest

Jan 17, 2024

+ 25 releases

Packages

0

No packages published

Used by 72.7k

+ 72,656

Contributors

57

+ 43 contributors

Languages

C++

92.2%

CMake

4.8%

JavaScript

1.3%

Python

0.6%

C#

0.6%

HTML

0.5%

Footer

© 2024 GitHub, Inc.

Footer navigation

Terms

Privacy

Security

Status

Docs

Contact

Manage cookies

Do not share my personal information

You can’t perform that action at this time.

Draco库简析_draco几何压缩-CSDN博客

>

Draco库简析_draco几何压缩-CSDN博客

Draco库简析

最新推荐文章于 2023-02-08 09:43:20 发布

竹以

最新推荐文章于 2023-02-08 09:43:20 发布

阅读量6.5k

收藏

23

点赞数

7

分类专栏:

点云相关信息汇总

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/l18850339134/article/details/107785515

版权

点云相关信息汇总

专栏收录该内容

1 篇文章

0 订阅

订阅专栏

Draco库简析

一.简介

​ Draco是谷歌Chrome 团队在2017年1月发布的一个Draco是用于压缩和解压缩3D几何网格和点云的库,旨在改善3D图形的存储和传输,大幅加速 3D 数据的编码、传输和解码。这个开源算法的首要应用对象是浏览器。但可以去探索 Draco 在其他场景的应用,比如说非网页端。目前,谷歌提供了它的两个版本: JavaScript 和 C++。

​ Draco 可以被用来压缩 mesh 和点云数据。它还支持压缩点( compressing points),连接信息,纹理协调,颜色信息,法线以及其他与几何相关的通用属性。

​ Draco 的算法**既支持有损模式,也支持无损。**有损压缩带来的轻微画质改变完全在承受范围之内。用于游戏和 VR 应用完全没有问题,降低的画质很难用肉眼察觉。但在科研点云数据中,任何信息都不能丢失,就应使用无损压缩。

Draco是一种基于量化的压缩方法,是一种开放格式,具有一些关键优势:

顺序优化编码:Draco编码器使用基于KD-tree的编码器重新排列点以实现最佳压缩。

通用属性:Draco可以压缩通用属性,例如强度和分类。

可配置的压缩:根据容忍的有损性,点云可以使用1到31个量化位之间的任何位置。压缩率可以调整为毫米或更高的精度。

二.文献收集

1. 文献-用Draco压缩ROS传感器和几何信息-Compressing ROS Sensor and Geometry Messages with Draco

例如,Draco非常依赖Edgebreaker[7]技术来压缩网格数据。有关基本网格压缩技术的详细综述见[8]。

对于点云数据,大多采用基于八叉树的方法,编码复杂。为了减少传输数据量,八叉树的深度被限制为取决于可用带宽的确定值。对于三维几何体,现有的方法将连通性编码和其他度量考虑在内。例如,Draco非常依赖Edgebreaker[7]技术来压缩网格数据。有关基本网格压缩技术的详细综述见[8]。

在[10]中,Doumanoglou等人。在3D几何数据的实时流媒体环境中,对Google Draco[6]、O3dgc[11]、Corto[12]和OpenCTM[13]进行了广泛的评估。他们得出了两个有趣的发现,**启发了本文的工作:Draco在延迟更高的场景中优于其他库;其次,Draco还可以有效地包含额外的顶点属性,如法线或颜色。**在这项工作中,我们利用了这种可扩展性,还将人脸属性(如材质)包含到编码的数据流中,而据我们所知,这些数据流以前从未被评估过。

Draco是Google[6]开发的一种压缩算法,可以压缩网格和点云数据。由于两种数据表示在本质上是不同的,它不依赖于单一的压缩算法,而是使用多种不同的技术在压缩比、解码速度和离散化损失方面对这两种表示进行优化压缩。因此,与一般用途的算法(例如gzip)相比,由于这种专门化,它提供了更高的性能。**对于点云数据,Draco主要依靠使用kd树重新排列点的顺序优化编码。位置数据由可配置数量的量化比特离散化。虽然这自然会导致空间分辨率的损失,但可以根据精度或视觉质量的要求对其进行微调。Draco还支持压缩任意点属性,使其非常适合于异构数据。为了压缩网格拓扑,Draco依赖于Edgebreaker算法[7]。Edgebreaker尝试以螺旋形的形式对网格进行编码,将每个三角形面在字符串中的连接进行编码,同时跟踪已经访问过的顶点和面。然后这些字符串由库单独压缩。虽然Draco允许微调许多内部参数,但压缩主要受用于压缩的量化比特数的影响(最小值为1,最大值为31)。它们可以为每个顶点属性单独设置,并允许根据所需精度以不同方式处理每个属性。另外,可以定义速度设置,其允许用户调整压缩和解压缩时间的比率以及预期的压缩比。在压缩时间上,库根据这些需求选择压缩特性的最佳组合。这种参数化允许在最佳精度以及根据需要快速编码和解码速度之间对压缩进行非常细粒度的调整。**对于我们的用户,我们坚持使用自动压缩设置并评估量化设置,因为这个参数对压缩率和几何质量有着最显著的影响。

[7] J. Rossignac, “Edgebreaker: Connectivity compression for triangle meshes,” IEEE Transactions on Visualization and Computer Graphics, vol. 5, no. 1, pp. 47–61, Jan. 1999

[8] J. Peng, C.-S. Kim, and C.-C. J. Kuo, “Technologies for 3d mesh compression: A survey,” Journal of Visual Communication and Image Representation, vol. 16, no. 6, pp. 688–733, 2005.

[10] A. Doumanoglou, P . Drakoulis, N. Zioulis, D. Zarpalas, and P . Daras,“Benchmarking open-source static 3d mesh codecs for immersivemedia interactive live streaming,” IEEE Journal on Emerging andSelected Topics in Circuits and Systems, vol. 9, no. 1, pp. 190–203, March 2019.

2. 文献-用于沉浸式媒体交互式实时流媒体的开源静态三维网格编解码器的基准测试-Benchmarking Open-Source Static 3D Mesh Codecs for Immersive Media Interactive Live Streaming

更具体地说,我们考虑了以下编解码器:Google Draco[12]、Corto[13]、MPEG的开放式3D图形压缩(O3dgc)[14]和OpenCTM[15]。在这些开源实现中,Draco基于[16],Corto基于[17],O3dgc基于[18],而OpenCTM是唯一不基于任何学术出版物的库。

Draco使用Edgebreaker[16]作为其底层网格压缩算法。

**Edgebreaker:**通过一系列步骤遍历3D网格。在每一步,算法访问并编码一个尚未访问的三角形网格。在每个阶段,输入网格被划分为可以共享一个顶点但没有边的脱节区域。包围每个区域的边构成一条多边形曲线,称为“环”。循环的边缘被称为“门”,每一步都有一个门处于活动状态。在每一步中,都有一个三角形与活动门相连,但尚未访问。让v表示这个三角形的顶点,它不与门相关联。Edgebreaker编码了v相对于门的环边界和门本身的关系。Edgebreaker突出显示了5个标记为:C、L、E、R、S的情况。当v不属于活动门回路时,此情况标记为C。当v属于主动门回路并且也与主动门相连时,则根据v与(R或L)相关联的活动门侧,将此情况标记为R、L或E。当v入射到有源门的两侧时,该条件被标记为E。最后,v属于环路但不与有源门相关的条件被标记为S。在图2中,描述了所有Edgebreaker情况的示例。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6T0dwBzJ-1596521986792)(E:\markdown笔记\picture\image-20200801215436803.png)]

图3:TFAN编码示例。已经处理了黑色三角形。尚未处理蓝色三角形。当前编码为灰色的TF。将顶点聚焦为绿色。第一次访问的顶点为黄色。顶点已访问为红色。根据顶点的遍历顺序标记为焦点顶点。左:编码向量:S={1,1,1,1},I={}。右:S={0,1,1,0},I={2,1}。

编解码器配置文件在本小节中,我们将简要概述可通过参与此基准测试的每个3D mesh编解码器的可编程接口访问的可用配置选项。对于其中的每一个,相应配置的值隐式地影响其速率失真性能和执行时间。正如前面在第四节开头所介绍的,我们选择并命名特定的“概要文件”,这些配置文件包括每个编解码器的一组特定配置选项。在下面的小节中,将介绍这些概要文件及其选项。

**Draco:Draco对各种浮点顶点属性(位置、法线和自定义属性)进行编码,细节级别由给定的量化位指定。还支持自定义整数属性。**在我们的例子中,pervertex纹理标识符被无损地编码为整数,而纹理混合权重的精度由指定数量的量化比特控制。Draco接口允许通过“速度”设置来调整处理时间与压缩比混合比例,该设置以整数刻度表示,从10(表示最小化处理时间的选项组合)到0(表示导致最可能压缩表示的选项)。我们选择了三种配置进行基准测试,即“Draco2”、“Draco5”和“Draco9”,速度设置分别设置为2、5(默认值)和9(使用底层EdgeBreaker[16]算法的最快设置)。

本文对Corto、Draco、O3dgc和OpenCTM四种开源静态3D-mesh编解码器的比特率、失真度和处理时间进行了广泛、系统和一致的基准测试。与其他工作相比,我们的工作彻底检查了编解码器的性能,不仅压缩几何体和连通性,而且在压缩顶点法线和属性。首先,我们评估了失真率,以及正常的几何失真属性。随后,我们在上述所有方面设定了失真的目标水平,这导致了良好质量(至少在客观方面)的压缩表示,但仍然显著可压缩。对于这些预设的失真程度,我们从比特率和处理时间两个方面评估了编解码器之间的性能。我们得出的结论是,通过相对分析来判断哪个编解码器性能最好并不容易,因为没有一个编解码器在所有比特率、编码和解码时间方面都名列前茅。因此,我们继续对编解码器的性能进行研究,通过在一个远程沉浸式交互式实时流媒体场景中检查它们的理论性能。我们建立了一个TI管道的理论模型,分析计算了端到端延迟的下限和上限,以及在使用这些编解码器时某些常见网络条件下的预期帧速率。我们对TI管道理论模型的拟合值是通过之前进行的大量基准测试得到的。总的来说,我们发现在直播场景中,对于O3dgc的每个配置文件,确实存在一个在所有相关的编解码器方面性能更好的Draco概要文件。此外,除了压缩几何体和连通性的情况外,Corto编解码器在所有方面的性能都比OpenCTM的配置文件好。我们的实时流分析表明,在TI管道中选择Corto和Draco应该是一个基于网络条件的决定,Corto在RTT较低的网络设置上表现最好,而当线路的RTT增加时,Draco的表现更好。本研究的结果可供设计人员选择最佳的三维网状编解码器。此外,上述分析可作为未来3D压缩研究的基准,因为很明显,仍有改进的空间,因为根据我们的理论分析,当所使用的网络参数与实际互联网更接近时,次优帧速率被大多数人实现编解码器。

[16] J. Rossignac, “Edgebreaker: Connectivity compression for triangle meshes,” IEEE Transactions on Visualization and Computer Graphics, vol. 5, no. 1, pp. 47–61, Jan. 1999

3.文献-纹理网格vs彩色点云:V体积视频压缩的主观研究-Textured Mesh vs Coloured Point Cloud A Subjective Study for Volumetric Video Compression

Doumanoglou et al.[22]和Christaki et al.[23]研究了不同的开源网格压缩算法,在比较中发现谷歌的Draco表现最好。

考虑到VV将在不久的将来与传统的视觉媒体一起使用,我们在本文中考虑了压缩场景。考虑到最近的研究结果,我们选择了[22]、[23]、谷歌的Draco编码器来压缩以多边形网格表示的VV。在这种情况下,JPEG压缩被用于纹理图集。对于表示为点云的VVs,我们考虑了MPEG标准化工作[9]:G-PCC和V-PCC中正在开发的最先进的压缩算法。Draco和G-PCC被提出用于压缩静态体积含量,而V-PCC被开发用于压缩VV。由于Draco和G-PCC不考虑时间冗余,因此我们加入了V -PCC的all-intra选项以公平地比较它们。

三.安装和编译

源码地址:https://github.com/google/draco

编译好的程序:https://pan.baidu.com/s/1I4E0-9qgrDCZOOHYeaEZXA

源码编译

在Windows下通过Cmake构建VS2017项目并打开

C*:**\ Users \ nobody> cmake …/ -G “ Visual Studio 15 2017 Win64”*

以release版本和64位进行编译即可在debug目录下得到draco编译好的编码器和解码器在Linux下直接Cmake后在make就能编译

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TUk3dH4p-1596521986794)(E:\markdown笔记\picture\clip_image002.jpg)]

程序使用

draco_encoder将读取OBJ或PLY文件作为输入,并输出Draco编码的文件。

./draco_encoder -i testdata/bun_zipper.ply -o out.drc

量化参数的值0将不会对指定属性执行任何量化。除0以外的任何值都会将指定属性的输入值量化为该位数。例如

./draco_encoder -i testdata/bun_zipper.ply -o out.drc -qp 14

将位置量化为14位(位置坐标的默认值为11)。

一般来说,量化属性越多,压缩率就越高。由你的项目来决定它能容忍多少偏差。一般来说,大多数项目可以将量化值设置为大约11,而不会在质量上有任何明显的差异。

· 压缩级别(-cl)参数打开/关闭不同的压缩功能

./draco_encoder -i testdata/bun_zipper.ply -o out.drc -cl 8

编码点云

通过指定-point_cloud参数,可以使用draco_encoder对点云数据进行编码。如果使用网格输入文件指定-point_cloud参数,则draco_encoder将忽略连接数据并从网格文件编码位置

./draco_encoder -point_cloud -i testdata/bun_zipper.ply -o out.drc

此命令行将网格输入编码为点云,即使输入可能不会产生代表其他点云的压缩

解码点云

draco_decoder将读取draco文件作为输入,并输出OBJ或PLY文件。基本命令行如下所示:

./draco_decoder -i in.drc -o out.obj

压缩测试

(1)40m obj文件压缩成1m,时间在1s之后,在浏览器解码渲染时间也在1s之内,快速,但是没有材质信息,模型质量还未验证。

(2)150m压缩成6m,cl=7,encodeTime=3.6s,decodeTime=5.2s,importTime=1.5s。

压缩效率很高,浏览器解码和渲染时间也能接受,但是这样直接压缩大型文件,在浏览器渲染时会占用大量本地内存,高达1.3G内存都被这个页面占用。渲染质量未验证。

四.框架及源码初步分析

1.编码框架

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y1MGirDe-1596521986796)(E:\markdown笔记\picture\image-20200803131119370.png)]

2.支持的算法、属性等信息

以下为配置代码,可以简要了解Draco库中支持的各种算法和方案

总结:

支持的比特流版本? kDracoPointCloudBitstreamVersionMajor = 2; kDracoPointCloudBitstreamVersionMinor = 3; kDracoMeshBitstreamVersionMajor = 2; kDracoMeshBitstreamVersionMinor = 2; 比特流连接支持的版本? kDracoPointCloudBitstreamVersion = DRACO_BITSTREAM_VERSION (kDracoPointCloudBitstreamVersionMajor, ​ kDracoPointCloudBitstreamVersionMinor); DracoMeshBitstreamVersion = DRACO_BITSTREAM_VERSION ( kDracoMeshBitstreamVersionMajor,kDracoMeshBitstreamVersionMinor); 当前支持的文件形式 点云 三角网格 点云的编码方法 POINT_CLOUD_SEQUENTIAL_ENCODING POINT_CLOUD_KD_TREE_ENCODING 网格的编码方法 MESH_SEQUENTIAL_ENCODING MESH_EDGEBREAKER_ENCODING 支持的各种属性编码器 BASIC_ATTRIBUTE_ENCODER MESH_TRAVERSAL_ATTRIBUTE_ENCODER KD_TREE_ATTRIBUTE_ENCODER 支持的顺序编码器? SEQUENTIAL_ATTRIBUTE_ENCODER_GENERIC = 0 通用 SEQUENTIAL_ATTRIBUTE_ENCODER_INTEGER 整数 SEQUENTIAL_ATTRIBUTE_ENCODER_QUANTIZATION 量化 SEQUENTIAL_ATTRIBUTE_ENCODER_NORMALS 法线 支持的预测算法(mesh)? PREDICTION_NONE = -2, 不使用 PREDICTION_UNDEFINED = -1, 未定义 PREDICTION_DIFFERENCE = 0, 差分 PREDICTION_PARALLELOGRAM = 1 平行四边形 PREDICTION_MULTI_PARALLELOGRAM = 2 多平行四边形 PREDICTION_TEX_COORDS_DEPRECATED = 3, 特克斯弃用坐标? PREDICTION_CONSTRAINED_MULTI_PARALLELOGRAM = 4 约束多平行四边形 PREDICTION_TEX_COORDS_PORTABLE = 5 特克斯坐标便携式 PREDICTION_GEOMETRIC_NORMAL = 6 几何法线 支持的预测方案转换列表 PREDICTION_TRANSFORM_NONE = -1, //基本delta变换,其中将预测计算为差预测值和原始值。 PREDICTION_TRANSFORM_DELTA = 0, //改进的增量转换,其中所有计算的增量值都被包装围绕固定间隔降低熵。 PREDICTION_TRANSFORM_WRAP = 1 //使用倒置图块对法线坐标进行专门的转换。 PREDICTION_TRANSFORM_NORMAL_OCTAHEDRON = 2 //使用规范化的倒数对法线坐标进行专门的变换磁贴。 PREDICTION_TRANSFORM_NORMAL_OCTAHEDRON_CANONICALIZED = 3, 支持的网格遍历算法 MESH_TRAVERSAL_DEPTH_FIRST = 0, 深度优先 MESH_TRAVERSAL_PREDICTION_DEGREE = 1 等级?优先 支持用于压缩edgebreaker算法的变体算法列表? // 用于网格连通性压缩的边断方法的所有变体列表。 MESH_EDGEBREAKER_STANDARD_ENCODING = 0, 标准编码 MESH_EDGEBREAKER_PREDICTIVE_ENCODING = 1, 预测编码 MESH_EDGEBREAKER_VALENCE_ENCODING = 2 瓦兰斯编码?

//draco_enc_config compression_share.h

// Currently, we support point cloud and triangular mesh encoding.

// TODO(draco-eng) Convert enum to enum class (safety, not performance).

//支持点云和三角网格编码

enum EncodedGeometryType {

INVALID_GEOMETRY_TYPE = -1,

POINT_CLOUD = 0,

TRIANGULAR_MESH,

};

// List of encoding methods for point clouds.

//对于点云支持顺序编码和八叉树编码

enum PointCloudEncodingMethod {

POINT_CLOUD_SEQUENTIAL_ENCODING = 0,

POINT_CLOUD_KD_TREE_ENCODING

};

// List of encoding methods for meshes.

// 对于网格支持顺序编码和EDGEBREAKER编码

enum MeshEncoderMethod {

MESH_SEQUENTIAL_ENCODING = 0,

MESH_EDGEBREAKER_ENCODING,

};

// List of various attribute encoders supported by our framework. The entries

// are used as unique identifiers of the encoders and their values should not

// be changed!

//各种属性的列表编码器支持我们的框架。编码器的条目作为惟一标识符和它们的值不应该改变!

enum AttributeEncoderType {

BASIC_ATTRIBUTE_ENCODER = 0,

MESH_TRAVERSAL_ATTRIBUTE_ENCODER,

KD_TREE_ATTRIBUTE_ENCODER,

};

//各种连续属性列表编码器/解码器,可以用于我们的管道。的值代表解码器使用的惟一标识符,他们不应该被改变。

enum SequentialAttributeEncoderType {

SEQUENTIAL_ATTRIBUTE_ENCODER_GENERIC = 0,

SEQUENTIAL_ATTRIBUTE_ENCODER_INTEGER,

SEQUENTIAL_ATTRIBUTE_ENCODER_QUANTIZATION,

SEQUENTIAL_ATTRIBUTE_ENCODER_NORMALS,

};

// List of all prediction methods currently supported by our framework.

//draco目前支持的预测编码

enum PredictionSchemeMethod {

// Special value indicating that no prediction scheme was used.

PREDICTION_NONE = -2,

// Used when no specific prediction scheme is required.

PREDICTION_UNDEFINED = -1,

PREDICTION_DIFFERENCE = 0,

MESH_PREDICTION_PARALLELOGRAM = 1,

MESH_PREDICTION_MULTI_PARALLELOGRAM = 2,

MESH_PREDICTION_TEX_COORDS_DEPRECATED = 3,

MESH_PREDICTION_CONSTRAINED_MULTI_PARALLELOGRAM = 4,

MESH_PREDICTION_TEX_COORDS_PORTABLE = 5,

MESH_PREDICTION_GEOMETRIC_NORMAL = 6,

NUM_PREDICTION_SCHEMES

};

// List of all prediction scheme transforms used by our framework.

//预测方案转换列表?

enum PredictionSchemeTransformType {

PREDICTION_TRANSFORM_NONE = -1,

// Basic delta transform where the prediction is computed as difference the

// predicted and original value.

PREDICTION_TRANSFORM_DELTA = 0,

// An improved delta transform where all computed delta values are wrapped

// around a fixed interval which lowers the entropy.

PREDICTION_TRANSFORM_WRAP = 1,

// Specialized transform for normal coordinates using inverted tiles.

PREDICTION_TRANSFORM_NORMAL_OCTAHEDRON = 2,

// Specialized transform for normal coordinates using canonicalized inverted

// tiles.

PREDICTION_TRANSFORM_NORMAL_OCTAHEDRON_CANONICALIZED = 3,

};

// List of all mesh traversal methods supported by Draco framework.

//列出Draco框架支持的所有网格遍历方法。

enum MeshTraversalMethod {

MESH_TRAVERSAL_DEPTH_FIRST = 0,

MESH_TRAVERSAL_PREDICTION_DEGREE = 1,

NUM_TRAVERSAL_METHODS

};

// List of all variant of the edgebreaker method that is used for compression

// of mesh connectivity.

//用于网格连通性压缩的边断方法的所有变体列表。

enum MeshEdgebreakerConnectivityEncodingMethod {

MESH_EDGEBREAKER_STANDARD_ENCODING = 0,

MESH_EDGEBREAKER_PREDICTIVE_ENCODING = 1, // Deprecated.

MESH_EDGEBREAKER_VALENCE_ENCODING = 2,

};

// Draco header V1

struct DracoHeader {

int8_t draco_string[5];

uint8_t version_major;

uint8_t version_minor;

uint8_t encoder_type;

uint8_t encoder_method;

uint16_t flags;

};

enum NormalPredictionMode {

ONE_TRIANGLE = 0, // To be deprecated.

TRIANGLE_AREA = 1,

};

// Different methods used for symbol entropy encoding.

//符号熵编码的不同方法

enum SymbolCodingMethod {

SYMBOL_CODING_TAGGED = 0,

SYMBOL_CODING_RAW = 1,

NUM_SYMBOL_CODING_METHODS,

};

// Mask for setting and getting the bit for metadata in |flags| of header.

#define METADATA_FLAG_MASK 0x8000

} // namespace draco

#endif // DRACO_COMPRESSION_CONFIG_COMPRESSION_SHARED_H_

3.Draco实现过程简析(mesh)

参考网址:https://blog.csdn.net/woolseyyy/article/details/63684045?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-2&spm=1001.2101.3001.4242

3.1.encoder过程

encode入口:/tools/draco_encoder.cc: int main()

代码前面大多是对用户设定的数值和编码器等进行选择,其核心代码:

if (mesh && mesh->num_faces() > 0)

ret = EncodeMeshToFile(*mesh, encoder_options, options.output);

else

ret = EncodePointCloudToFile(*pc.get(), encoder_options, options.output);

这里先做判断,判断数据中是否有多个面:

如果有面,则进行Mesh to File的过程若不存在面,则只进行PointCloud to File的过程

PointCloud是n维空间中的点的集合,PointCloud的相关信息在*…/point_cloud/point_cloud.h* 中,内容较多,暂不贴出 而Mesh是PointCloud的继承类,Mesh只是比PointCloud多了Face数据: …/mesh/mesh.h

3.2.MeshToFile和MeshToBuffer过程

核心代码:

int EncodeMeshToFile(const draco::Mesh &mesh,

const draco::EncoderOptions &options,

const std::string &file) {

draco::CycleTimer timer;

// Encode the geometry.

draco::EncoderBuffer buffer;

timer.Start();

if (!draco::EncodeMeshToBuffer(mesh, options, &buffer)) {

printf("Failed to encode the mesh.\n");

return -1;

}

timer.Stop();

// Save the encoded geometry into a file.

std::ofstream out_file(file, std::ios::binary);

if (!out_file) {

printf("Failed to create the output file.\n");

return -1;

}

out_file.write(buffer.data(), buffer.size());

printf("Encoded mesh saved to %s (%" PRId64 " ms to encode)\n", file.c_str(),

timer.GetInMs());

printf("\nEncoded size = %zu bytes\n\n", buffer.size());

return 0;

}

这里可以分为两步:

调用 draco::EncodeMeshToBuffer 将 Mesh encode 并存入buffer中将buffer内容调用系统i/o写入file中

函数:draco::EncodeMeshToBuffer

这里draco::EncodeMeshToBuffer的前两个参数是输入,第三个参数是输出,即buffer。这个函数的功能是根据option选择相应的encoder并进行编码,将结果存入buffer中

这个函数前面一部分都在处理option,根据option选择哪种encoder:

Sequential encodingEdgebreaker encoding

函数源码:

bool EncodeMeshToBuffer(const Mesh &m, const EncoderOptions &options,

EncoderBuffer *out_buffer) {

std::unique_ptr encoder;

// Select the encoding method only based on the provided options.

int encoding_method = options.GetGlobalInt("encoding_method", -1);

if (encoding_method == -1) {

// For now select the edgebreaker for all options expect of speed 10

if (options.GetSpeed() == 10) {

encoding_method = MESH_SEQUENTIAL_ENCODING;

} else {

encoding_method = MESH_EDGEBREAKER_ENCODING;

}

}

if (encoding_method == MESH_EDGEBREAKER_ENCODING) {

encoder = std::unique_ptr(new MeshEdgeBreakerEncoder());

} else {

encoder = std::unique_ptr(new MeshSequentialEncoder());

}

if (encoder)

encoder->SetMesh(m);

return EncodeGeometryToBuffer(encoder.get(), options, out_buffer);

}

然后利用encoder->SetMesh(const Mesh &m)来对encoder内部的一些数据进行了初始化,就是把Mesh和CloudPoint信息在Encoder里也存了一下

源码:

…/compression/mesh/mesh_encoder.cc

void MeshEncoder::SetMesh(const Mesh &m) {

mesh_ = &m;

SetPointCloud(m);

}

…/compression/point_cloud/point_cloud_encoder.cc

void PointCloudEncoder::SetPointCloud(const PointCloud &pc) {

point_cloud_ = &pc;

}

(这里因为Mesh是PointCloud的继承,所以直接把Mesh数据传进SetPointCloud函数了)

最后进行了几何信息的编码,这是这个函数的核心代码,之前都没干什么正事,这里进行了真正的编码

3.3.EncodeGeometryToBuffer过程

最后进行了几何信息的编码,这是这个函数的核心代码

return EncodeGeometryToBuffer(encoder.get(), options, out_buffer);

…/compression/encode.cc

bool EncodeGeometryToBuffer(PointCloudEncoder *encoder,

const EncoderOptions &options,

EncoderBuffer *out_buffer) {

if (!encoder)

return false;

if (!EncodeHeader(*encoder, out_buffer))

return false;

if (!encoder->Encode(options, out_buffer))

return false;

return true;

}

这里首先用EncoderHeader将encoder的一些基本信息写入buffer,以便今后decode 这些信息包括:”DRACO”字符串标识、major version、minor version、encoder type(point cloud, mesh, …)、selected encoding method (edgebreaker, etc…)、保留标识

然后用encoder->Encode根据option对数据进行编码,写入buffer.

3.4.Encoder编码过程

在这个函数中,具体对encoder data、geometry data、point atrributes进行了编码。

这里InitializeEncoder的功能是可以由派生类实现,以执行编码器的任何自定义初始化。在Encode()方法中调用。

EncodeEncoderData的功能是决定是否应该用于编码任何编码特定的数据

不过这两个都是预留接口,设置了虚函数但没有实现,直接返回true

EncoderGeometryData()会把mesh 的 connectivity进行编码并存入buffer,根据encoder的不同,编码connectivity的方式会分为sequential encoding 和 edgebreaker encoding。

…/compression/point_cloud/point_cloud_encoder.cc

bool PointCloudEncoder::Encode(const EncoderOptions &options,

EncoderBuffer *out_buffer) {

options_ = &options;

buffer_ = out_buffer;

// Cleanup from previous runs.

attributes_encoders_.clear();

attribute_to_encoder_map_.clear();

attributes_encoder_ids_order_.clear();

if (!point_cloud_)

return false;

if (!InitializeEncoder())

return false;

if (!EncodeEncoderData())

return false;

if (!EncodeGeometryData())

return false;

if (!EncodePointAttributes())

return false;

return true;

}

3.4.EncodePointAttributes

这里point attributes 的意思是指定每个属性的特定数据。通常,存储在点云中的多个点可以共享相同的属性值,该类在点id和属性值id之间提供了必要的映射。

我的理解是,通过这个函数进行属性压缩。

源码及其位置:

…/compression/point_cloud/point_cloud_encoder.cc

bool PointCloudEncoder::EncodePointAttributes() {

if (!GenerateAttributesEncoders())

return false;

// Encode the number of attribute encoders.

buffer_->Encode(static_cast(attributes_encoders_.size()));

// Initialize all the encoders (this is used for example to init attribute

// dependencies, no data is encoded in this step).

for (auto &att_enc : attributes_encoders_) {

if (!att_enc->Initialize(this, point_cloud_))

return false;

}

// Rearrange attributes to respect dependencies between individual attributes.

if (!RearrangeAttributesEncoders())

return false;

// Encode any data that is necessary to create the corresponding attribute

// decoder.

for (int att_encoder_id : attributes_encoder_ids_order_) {

if (!EncodeAttributesEncoderIdentifier(att_encoder_id))

return false;

}

// Also encode any attribute encoder data (such as the info about encoded

// attributes).

for (int att_encoder_id : attributes_encoder_ids_order_) {

if (!attributes_encoders_[att_encoder_id]->EncodeAttributesEncoderData(

buffer_))

return false;

}

// Lastly encode all the attributes using the provided attribute encoders.

if (!EncodeAllAttributes())

return false;

return true;

}

3.6、7、8…还有好多,实在看不懂,先放着了。

4.Draco库的代码应用案例

这是网上找到的一个通过调用库函数实现自建代码实现的案例,源码如下:

压缩三角网,包括点的位置meshPositions、法线meshnormals、纹理坐标meshUv

示例使用c++完成。

具体步骤

1、初始化变量和数据。

初始化一个四边形,两个三角网

//顶点信息

float meshPositions[12] = {0, 0, 0,

100, 0, 0,

100, 100, 0,

0, 100, 0};

//法线信息

float meshnormals[12] = {0, 1, 0,

0, 1, 0,

0, 1, 0,

0, 1, 0};

//纹理信息

float meshUv[8] = {0, 0,

0, 1,

1, 1,

1, 0};

//索引信息,两个三角形

unsigned short primitiveIndices[6] = {3, 1, 0,

3, 2, 1};

2、将数据初始化到draco中

创建draco对象

// Add faces to Draco mesh. 向Draco网格添加面。

std::unique_ptr dracoMesh(new draco::Mesh());

//写入面索引

const int numTriangles = sizeof(primitiveIndices) / sizeof(primitiveIndices[0]) / 3;//面个数

dracoMesh->SetNumFaces(numTriangles);//设置面个数

for (draco::FaceIndex i(0); i < numTriangles; ++i) {

draco::Mesh::Face face;

face[0] = primitiveIndices[i.value() * 3];

face[1] = primitiveIndices[i.value() * 3 + 1];

face[2] = primitiveIndices[i.value() * 3 + 2];

dracoMesh->SetFace(i, face);

}

压缩顶点

//顶点位置

//为Draco网格创建属性。

draco::GeometryAttribute::Type att_type = draco::GeometryAttribute::POSITION;

const int componentCount = 3;//每个顶点有xyz三个值

//顶点

const int vertexCount = sizeof(meshPositions) / sizeof(meshPositions[0]) / componentCount;

draco::PointAttribute att;

int byte_stride = sizeof(float) * componentCount;//每个顶点的步长,xyz坐标和数据大小,3*4 xyz是3每个是浮点型

att.Init(att_type, componentCount, draco::DT_FLOAT32, false, byte_stride);

int att_id = dracoMesh->AddAttribute(att, /* identity_mapping */ true, vertexCount);

draco::PointAttribute *att_ptr = dracoMesh->attribute(att_id);

//要注意压缩网格后属性id不必与唯一ID相同,但unqiue id不会改变。添加顶点

for (draco::PointIndex i(0); i < vertexCount; i++) {

std::vector vertex_data(componentCount);

memcpy(&vertex_data[0], &meshPositions[i.value() * componentCount], sizeof(float) * componentCount);

att_ptr->SetAttributeValue(att_ptr->mapped_index(i), &vertex_data[0]);

}

法线

//法线

const int normalCount = sizeof(meshnormals) / sizeof(meshnormals[0]) / componentCount;

att_type = draco::GeometryAttribute::NORMAL;

draco::PointAttribute attnormal;

attnormal.Init(att_type, componentCount, draco::DT_FLOAT32, false, sizeof(float) * componentCount);

int normalatt_id = dracoMesh->AddAttribute(attnormal, /* identity_mapping */ true, normalCount);

draco::PointAttribute *normalatt_ptr = dracoMesh->attribute(normalatt_id);

//要注意压缩网格后属性id不必与唯一ID相同,但unqiue id不会改变。添加法线

for (draco::PointIndex i(0); i < normalCount; i++) {

std::vector vertex_data(componentCount);

memcpy(&vertex_data[0], &meshnormals[i.value() * componentCount], sizeof(float) * componentCount);

normalatt_ptr->SetAttributeValue(normalatt_ptr->mapped_index(i), &vertex_data[0]);

}

纹理

//纹理

int uvCounts=2;

const int uvCount = sizeof(meshUv) / sizeof(meshUv[0]) / uvCounts;

att_type = draco::GeometryAttribute::TEX_COORD;

draco::PointAttribute attUv;

attnormal.Init(att_type, 2, draco::DT_FLOAT32, false, sizeof(float) * uvCounts);

int uvatt_id = dracoMesh->AddAttribute(attnormal, true, normalCount);

draco::PointAttribute *uvatt_ptr = dracoMesh->attribute(uvatt_id);

for (draco::PointIndex i(0); i < uvCount; i++) {

std::vector vertex_data(uvCounts);

memcpy(&vertex_data[0], &meshUv[i.value() * uvCounts], sizeof(float) * uvCounts);

uvatt_ptr->SetAttributeValue(uvatt_ptr->mapped_index(i), &vertex_data[0]);

}

3、创建draco压缩对象

//压缩draco

draco::Encoder encoder;

const int posQuantizationBits = 14;

const int texcoordsQuantizationBits = 10;

const int normalsQuantizationBits = 10;

const int colorQuantizationBits = 8;

const int genericQuantizationBits = 8;

//设置压缩参数

encoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION, posQuantizationBits);

encoder.SetAttributeQuantization(draco::GeometryAttribute::TEX_COORD, texcoordsQuantizationBits);

encoder.SetAttributeQuantization(draco::GeometryAttribute::NORMAL, normalsQuantizationBits);

encoder.SetAttributeQuantization(draco::GeometryAttribute::COLOR, colorQuantizationBits);

encoder.SetAttributeQuantization(draco::GeometryAttribute::GENERIC, genericQuantizationBits);

draco::EncoderBuffer dracoBuffer;//压缩后存储的对象

const draco::Status status = encoder.EncodeMeshToBuffer(*dracoMesh, &dracoBuffer);//压缩数据

4、获取压缩的数据

if (!status.ok()) {

std::cerr << "Error: Encode mesh.\n";

} else {

std::cout << "success" << std::endl;

std::cout << dracoBuffer.size() << std::endl;//压缩后的数据大小

std::cout << dracoBuffer.data() << std::endl;//压缩后的数据

}

完整代码如下

int main(int argc, char **argv) {

std::cout << "Hello, World!" << std::endl;

//顶点信息

float meshPositions[12] = {0, 0, 0,

100, 0, 0,

100, 100, 0,

0, 100, 0};

//法线信息

float meshnormals[12] = {0, 1, 0,

0, 1, 0,

0, 1, 0,

0, 1, 0};

//纹理信息

float meshUv[8] = {0, 0,

0, 1,

1, 1,

1, 0};

//索引信息,两个三角形

unsigned short primitiveIndices[6] = {3, 1, 0,

3, 2, 1};

// Add faces to Draco mesh. 向Draco网格添加面。

std::unique_ptr dracoMesh(new draco::Mesh());

//写入面索引

const int numTriangles = sizeof(primitiveIndices) / sizeof(primitiveIndices[0]) / 3;//面个数

dracoMesh->SetNumFaces(numTriangles);//设置面个数

for (draco::FaceIndex i(0); i < numTriangles; ++i) {

draco::Mesh::Face face;

face[0] = primitiveIndices[i.value() * 3];

face[1] = primitiveIndices[i.value() * 3 + 1];

face[2] = primitiveIndices[i.value() * 3 + 2];

dracoMesh->SetFace(i, face);

}

//顶点位置

//为Draco网格创建属性。

draco::GeometryAttribute::Type att_type = draco::GeometryAttribute::POSITION;

const int componentCount = 3;//每个顶点有xyz三个值

//顶点

const int vertexCount = sizeof(meshPositions) / sizeof(meshPositions[0]) / componentCount;

draco::PointAttribute att;

int byte_stride = sizeof(float) * componentCount;//每个顶点的步长,xyz坐标和数据大小,3*4 xyz是3每个是浮点型

att.Init(att_type, componentCount, draco::DT_FLOAT32, false, byte_stride);

int att_id = dracoMesh->AddAttribute(att, /* identity_mapping */ true, vertexCount);

draco::PointAttribute *att_ptr = dracoMesh->attribute(att_id);

//要注意压缩网格后属性id不必与唯一ID相同,但unqiue id不会改变。添加顶点

for (draco::PointIndex i(0); i < vertexCount; i++) {

std::vector vertex_data(componentCount);

memcpy(&vertex_data[0], &meshPositions[i.value() * componentCount], sizeof(float) * componentCount);

att_ptr->SetAttributeValue(att_ptr->mapped_index(i), &vertex_data[0]);

}

//法线

const int normalCount = sizeof(meshnormals) / sizeof(meshnormals[0]) / componentCount;

att_type = draco::GeometryAttribute::NORMAL;

draco::PointAttribute attnormal;

attnormal.Init(att_type, componentCount, draco::DT_FLOAT32, false, sizeof(float) * componentCount);

int normalatt_id = dracoMesh->AddAttribute(attnormal, /* identity_mapping */ true, normalCount);

draco::PointAttribute *normalatt_ptr = dracoMesh->attribute(normalatt_id);

//要注意压缩网格后属性id不必与唯一ID相同,但unqiue id不会改变。添加法线

for (draco::PointIndex i(0); i < normalCount; i++) {

std::vector vertex_data(componentCount);

memcpy(&vertex_data[0], &meshnormals[i.value() * componentCount], sizeof(float) * componentCount);

normalatt_ptr->SetAttributeValue(normalatt_ptr->mapped_index(i), &vertex_data[0]);

}

//纹理

int uvCounts=2;

const int uvCount = sizeof(meshUv) / sizeof(meshUv[0]) / uvCounts;

att_type = draco::GeometryAttribute::TEX_COORD;

draco::PointAttribute attUv;

attnormal.Init(att_type, 2, draco::DT_FLOAT32, false, sizeof(float) * uvCounts);

int uvatt_id = dracoMesh->AddAttribute(attnormal, true, normalCount);

draco::PointAttribute *uvatt_ptr = dracoMesh->attribute(uvatt_id);

for (draco::PointIndex i(0); i < uvCount; i++) {

std::vector vertex_data(uvCounts);

memcpy(&vertex_data[0], &meshUv[i.value() * uvCounts], sizeof(float) * uvCounts);

uvatt_ptr->SetAttributeValue(uvatt_ptr->mapped_index(i), &vertex_data[0]);

}

//压缩draco

draco::Encoder encoder;

const int posQuantizationBits = 14;

const int texcoordsQuantizationBits = 10;

const int normalsQuantizationBits = 10;

const int colorQuantizationBits = 8;

const int genericQuantizationBits = 8;

//设置压缩参数

encoder.SetAttributeQuantization(draco::GeometryAttribute::POSITION, posQuantizationBits);

encoder.SetAttributeQuantization(draco::GeometryAttribute::TEX_COORD, texcoordsQuantizationBits);

encoder.SetAttributeQuantization(draco::GeometryAttribute::NORMAL, normalsQuantizationBits);

encoder.SetAttributeQuantization(draco::GeometryAttribute::COLOR, colorQuantizationBits);

encoder.SetAttributeQuantization(draco::GeometryAttribute::GENERIC, genericQuantizationBits);

draco::EncoderBuffer dracoBuffer;//压缩后存储的对象

const draco::Status status = encoder.EncodeMeshToBuffer(*dracoMesh, &dracoBuffer);//压缩数据

if (!status.ok()) {

std::cerr << "Error: Encode mesh.\n";

} else {

std::cout << "success" << std::endl;

std::cout << dracoBuffer.size() << std::endl;//压缩后的数据大小

std::cout << dracoBuffer.data() << std::endl;//压缩后的数据

}

system("pause");

return 0;

}

五.总结

它用 edge breaker 算法去压缩面的信息,并产生 CornerTable,用平行四边形差分方式压缩顶点属性信息。

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

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

总的来说,Draco整体思路是将网格的连接信息和几何信息进行分别编码并进行存储。 bute::GENERIC, genericQuantizationBits); draco::EncoderBuffer dracoBuffer;//压缩后存储的对象 const draco::Status status = encoder.EncodeMeshToBuffer(*dracoMesh, &dracoBuffer);//压缩数据 if (!status.ok()) { std::cerr << “Error: Encode mesh.\n”; } else { std::cout << “success” << std::endl; std::cout << dracoBuffer.size() << std::endl;//压缩后的数据大小 std::cout << dracoBuffer.data() << std::endl;//压缩后的数据 } system(“pause”); return 0; }

## 五.总结

它用 edge breaker 算法去压缩面的信息,并产生 CornerTable,用平行四边形差分方式压缩顶点属性信息。

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

1、Draco 在当前的VR、AR生态下,基本上没有直接使用的价值,想用它必须理解原理并修改源码。

2、Draco 里面有比较好的mesh压缩方案,有利于游戏引擎公司基于该代码优化自己的模型设计。

3、Draco 所能压缩的只是3D模型文件中的一部分,而3D相关的资源大头(图片)还是一个老大难的问题

总的来说,Draco整体思路是将网格的连接信息和几何信息进行分别编码并进行存储。

其中,几何信息使用SequentialAttributeEncodersController/KdTreeAttributesEncoder进行编码。而Sequential内部会对数据进行量化、预测压缩、熵编码。其中熵编码采用了rANS算法。Draco进行了层层封装、科学地使用多态,使得代码层次清晰,可扩展性好,但也带来了一定的阅读障碍。采用的Edgebreaker算法压缩性能方面还有待提升,对float的编码采用动态建立熵编码可能会比较慢,在直播情景下还需要实验验证并改进。

优惠劵

竹以

关注

关注

7

点赞

23

收藏

觉得还不错?

一键收藏

知道了

3

评论

Draco库简析

Draco库简析一.简介​ Draco是谷歌Chrome 团队在2017年1月发布的一个Draco是用于压缩和解压缩3D几何网格和点云的库,旨在改善3D图形的存储和传输,大幅加速 3D 数据的编码、传输和解码。这个开源算法的首要应用对象是浏览器。但可以去探索 Draco 在其他场景的应用,比如说非网页端。目前,谷歌提供了它的两个版本: JavaScript 和 C++。​ Draco 可以被用来压缩 mesh 和点云数据。它还支持压缩点( compressing points),连接信息

复制链接

扫一扫

专栏目录

适用3dtiles转gltf b3dm的draco编译静态库

05-30

vs2017 gltf draco c++ x64 release for cesium

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

热门推荐

jxt1234and2010的专栏

02-24

1万+

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

https://github.com/google/draco基本使用编译cmake . + make 编译源码,生成 draco_encoder 和 draco_decoder 两个可执行文件

3 条评论

您还未登录,请先

登录

后发表或查看评论

Draco代码分析(一) —— Encode过程&探究其数据编码方式

星海泛舟记

03-19

5475

Draco encode过程代码分析 - 探究其数据编码方式IntroductionDraco是谷歌在2017年1月发布的一个3D图形开源压缩库,提供了多种算法进行压缩和解压缩。

对于encoder过程,Draco整体思路是将网格的连接信息和几何信息进行分别编码并进行存储。

其中,连接信息使用了edgebreaker等算法进行了编码压缩,几何信息对数据进行量化、预测压缩、熵编码。其中熵编码采用了

Draco decoder.rar

05-17

最新版谷歌Draco开源算法的windows编译可执行程序,通过cmd命令将obj模型压缩为drc文件,大幅减少文件大小,已测试可用

draco-1.4.1.zip

08-13

google点云模型压缩编译后文件

drcobj:使用 draco 压缩和解压 three.js 模型文件。(Use draco to compress and decompress threejs-object files.)

04-29

Draco是用于压缩和解压缩3D几何网格和点云的开源库。 旨在改善3D图形的存储和传输。

您可以使用drcobj_exporter.js将threejs-object(.json)文件转换为draco压缩的threejs-object(.drcobj)文件, drcobj_loader.js是drcobj文件的加载器。

新版本!

与1.0.3.2版相比,1.1.0版将模型加载时间减少了50%以上!

模型文件大小比较

测试模型: ./ example / bunny.json

JSON格式

德科比

FBX

OBJ

特遣部队

GLB

2.98兆字节

146KB

1.82兆字节

6.8兆字节

2.12兆字节

1.6兆字节

如何使用

负荷模型

< script src =" ./three.js " >

< script src =" ./src/vendor

谷歌开源 3D 数据压缩算法 Draco以及代码分析

影音视频技术

11-20

1万+

笨重的显卡、更强大的 CPU、高分辨率显示屏,所有这些都对高品质3D 视觉体验十分重要——无论是对于游戏还是 VR。但如果用户需要等 n 年才能下载好高清内容,数据太大又无法直播,那么所有这一切都变得不重要。这就是为什么互联网巨头们——比如谷歌,会投入巨大时间精力来研究压缩数据的新方法。上周,谷歌发布了一个开源 3D 模型压缩库"Draco",它功能简单但是潜力不可限量。

Draco 由谷歌

Draco使用笔记(1)——图形解压缩

人生海海 山山而川

05-18

2365

详细论述了使用Draco进行图形解压缩的过程。

前端 3DTiles 效率优化(2)—— 采用 Draco 压缩模型

PHP代码的博客

02-08

1910

前端 3DTiles 效率优化(2)—— 采用 Draco 压缩模型

Cesium开发: Draco模型压缩

PHP代码的博客

02-08

459

Draco 由谷歌 Chrome 媒体团队设计,旨在大幅加速 3D 数据的编码、传输和解码

Draco节点安装包

04-27

Draco节点安装包支持ubuntu16.04以上和centos7以上

编译好的draco库,可直接使用,包含头文件、lib、bin

06-20

编译好的draco库,可直接使用,包含头文件、lib、bin

3D点云数据压缩-Draco demo

12-11

利用draco工具测试对3百万个点的点云数据压缩的效率,根据测试结果来看,在i7-11th笔记本上,纯压缩的时间最快约为719ms。

在/Release文件夹下找到编译完成的draco_encoder.exe,cmd命令行中输入.ply点云格式压缩指令:draco_encoder.exe -point_cloud -i test.ply -o out.drc -cl 10

draco:Draco是用于压缩和解压缩3D几何网格和点云的库。 旨在改善3D图形的存储和传输

02-26

消息

版本1.4.1发行

现在建议使用版本化的gstatic.com WASM和Javascript解码器。 要使用v1.4.1,请使用以下URL:

*

将*替换为要加载的文件。 例如

这适用于v1.3.6和v1.4.0发行版,并将与将来的Draco发行版一起使用。

Bug修复

1.4.0版发行

WASM和JavaScript解码器是从静态URL托管的。

建议始终从此URL提取Draco WASM和JavaScript解码器:

*

将*替换为要加载的文件。 例如

随着更多站点开始使用静态URL,用户将受益于将Draco解码器缓存在缓存中

更改了npm模块以使用WASM,从而使性能提高了约200%。

将Emscripten更新为2.0。

这将导致Draco编解码器模块返回一个Promise,而不是直接返回该模块。

请查看有关如何处理承诺的示例代码。

将NORMAL

蓝桥杯练习系统-基础题全解C++

最新发布

03-06

蓝桥杯练习系统-基础题全解C++

springboot145基于SpringBoot基于java的在线问卷调查系统的设计-毕业源码案例设计

03-06

如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于问卷调查信息管理方面的不规范,容错率低,管理人员处理数据费工费时,采用新开发的在线问卷调查系统可以从根源上规范整个数据处理流程的正规性和合法性。

在线问卷调查系统能够实现问卷管理,用户管理,题目管理,问卷调查管理,新闻资讯管理等功能。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。

在线问卷调查系统可以提高问卷调查信息管理问题的解决效率,优化问卷调查信息处理流程,并且能够保证存储数据的安全,它是一个非常可靠,非常安全的应用程序。

关键词:在线问卷调查系统;Mysql数据库;Java语言

Java毕设-基于springboot+vue的智慧图书管理系统设计与实现(附源码,数据库,教程).zip

03-06

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

Java毕设-基于springboot+Vue的人事管理系统(附源码,数据库,教程).zip

03-06

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

基于Java的家政服务平台的设计与实现(毕业论文)

03-06

Java基于springboot的家政服务平台的设计与实现

此家政服务平台利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。

家政服务平台有管理员,雇主,雇员三个角色。管理员功能有个人中心,雇主管理,雇员管理,资料认证管理,项目类型管理,服务项目管理,需求信息管理,服务预约管理,申请预约管理,签订合同管理,雇主评价管理,留言板管理,系统管理。雇主可以发布需求,雇员可以申请预约,雇主支付报酬,雇主和雇员可以签订合同,雇主可以对雇员进行评价。

three draco

06-26

Three Draco是指三个夜光龙星座,分别是北天龙、南天龙和小龙,它们都位于北半球的星空中。北天龙是夜空中最大的星座之一,代表着英国的传统和文化;南天龙则在夜空中扮演着守护神的角色,代表着神秘和灵魂的独立。小龙则位于北极附近,寓意着向未知世界的探索和冒险精神。

随着科技的不断发展,我们已能够探索和了解三 Dracos星座的许多神秘之处。例如,北天龙的恒星Altair和Vega以及南天龙的恒星Achernar都是超新星爆发后形成的,这对于揭示宇宙的起源和发展有着重要的意义。

总之,三 Dracos星座是夜空中最为著名的星座之一,它们寓意着历史、文化、神秘以及探索精神,也代表着人类对于宇宙的渴望和探索。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

竹以

CSDN认证博客专家

CSDN认证企业博客

码龄6年

暂无认证

1

原创

58万+

周排名

137万+

总排名

6556

访问

等级

86

积分

3

粉丝

7

获赞

3

评论

25

收藏

私信

关注

热门文章

Draco库简析

6554

分类专栏

点云相关信息汇总

1篇

最新评论

Draco库简析

m0_54755849:

博主你好 我想问一下这个DRACO算法可以对三维模型进行实时无损压缩吗,就比如在加载模型的过程中一边压缩,一边进行解压缩和加压缩后的模型加载?谢谢

Draco库简析

咕噜一口温开水:

先给文献就很棒

Draco库简析

Liang-z-x:

很好的文章!!

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

2020年1篇

目录

目录

分类专栏

点云相关信息汇总

1篇

目录

评论 3

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

【网格压缩测评】MeshQuan、MeshOpt、Draco - 知乎

【网格压缩测评】MeshQuan、MeshOpt、Draco - 知乎切换模式写文章登录/注册【网格压缩测评】MeshQuan、MeshOpt、DracoDeepKolos乐观 自信目录介绍KHR_mesh_quantization和EXT_meshopt_compression用途、用法性能(压缩、加载、解析)可用(场景、范围)缺点猜想未来改进方向总结介绍GLTF的压缩,估计都知道Draco,因为适配GLTFLoader到小程序的原因,发现还有不少其他压缩扩展,比如KHR_mesh_quantization和EXT_meshopt_compressionKHR_mesh_quantizationQuantization也就是向量化,是把用浮点数表示的数据使用整形数据表示,方便压缩存储,但是会丢失精度。之前在tfjs的模型有见过类似的方法,gltf的网格数据都是使用浮点数储存,一个单精度浮点数占32位4byte,一个顶点3个数12byte,纹理坐标8byte,法线,12byte,正切空间16byte,一个顶点附带的信息数量就需要48byte,那么使用通过该扩展,使用SHORT来保存顶点坐标,纹理坐标4byte,使用BYTE存储法线坐标4byte, 正切空间4byte(为了不破坏标准都是4的倍数byte),一共20byte所以经过向量化之后的网格能有大概58.4%的压缩。EXT_meshopt_compression该扩展于r122进入three。其压缩的pipeline如下。其中第五步则是上面的向量化。KHR_DRACO_MESH_COMPRESSIONhttps://github.com/google/draco 进一步了解可以阅读大佬的分析,默认压缩参数比上面的都激进些由于wasm的支持和js的体积和worker数量限制问题,小程序下就不太合适了。js版decoder比three都要大用法KHR_mesh_quantization和EXT_meshopt_compression可以使用同一个工具gltfpack> npm i -g gltfpack

# gltfpack命令行工具是C项目构建出WASM执行的,目测未来会有更多wasm这类项目产出

# KHR的优化版的basis trancoder是使用assemblyscript编译成wasm

# 转成KHR_mesh_quantization

> gltfpack -i model.glb -o out.glb

# EXT_meshopt_compression只需加个-cc参数即可

> gltfpack -i model.glb -o out.glb -cc使用gltfpack的好处是向量化的参数是可以调整的(需要meshopt扩展),比如法线需要更高精度的话修改-vn即可,具体使用阅读gltfpack -h即可KHR_DRACO_MESH_COMPRESSION可以使用gltf-pipeline> npm i -g gltf-pipeline

> gltf-pipeline -i model.glb -o out.glb -d同样也可以调整draco的向量化参数性能(压缩、加载、解析)那么下来就需要对比其压缩网格的性能对比了使用的模型是来源于glTF-Sample-Models这里可以看到仅仅有顶点数据ReciprocatingSaw.glb则是draco是最好的,其实原因也很简单,Draco默认压缩参数比meshQuan激进得多,但是有动画的BrainStem.glb meshOpt是最好的。WaterBottle.glb是都差不太多,因为顶点数量有限,纹理占据大量主要体积。那么由于默认参数是不相同的,对比起来draco就有优势了,所以把其他需要相同压缩参数重新对比下,这次仅仅需要对比BrainStem和ReciprocatingSaw即可,这里把gltfpack参数向draco对齐> gltfpack -i model.glb -o out.glb -vp 11 -vt 10

> gltfpack -i model.glb -o out.glb -vp 11 -vt 10 -cc可以看到即便修改了参数,MeshQuan大小还是没有变,因为已经成为标准的了,向量化的参数已经是固定无法修改了,但是MeshOpt有些许提升。Decoder加载使用某个压缩方案,除了需要对比压缩大小,还得对比decoder的加载难易程度(web,小程序等环境下),还有DracoLoader十几KB还没算进去值得注意是MeshOpt wasm版本是包含了两个版本一个是基础版,一个使用SIMD版不过官方没有提供asm版本,需要手动通过binaryen/wasm2js转换下即可,或者使用我转换好的meshopt_decoder.asm.module.js在decoder层面上感觉是MeshOpt完胜解析时间对比这里使用模型是默认参数压缩后的,电源模式是高性能,CPU一直在最高频率。尝试五次求均值,均是wasm版本。其中MeshOpt是SIMD版本,Chrome 88可以看到MeshQuan和MeshOpt均比未压缩加载时间减少了不少,Draco则增加不少,如果考虑decoder的加载时间则需要看首次加载,3个扩展里只有Darco会有影响,因为只有Draco是第一次加载gltf需要从网络下载wasm,MeshOpt是序列化好存在字符串里,使用时只需unpack即可,无需网络请求。asm版的解析时间对比在可用性部分压缩前后效果对比按道理除了对比性能上面的指标,还得对比压缩后是否出问题了,但是这个并不容易指标化,还是得看设计师是否妥协了,但是为了直观对比,所以我编写了一个compressed-model-diff工具有3个对比模式和线框对比在线使用。可用(场景、范围)可用场景主要取决于Decoder加载难以程度和大小了可以看到Draco在小程序上面就比较难受了,而MeshQuan无需decoder所以可用性是最高的,MeshOpt只需使用asm版兼容小程序ios即可。所以如果需要兼容小程序平台,Draco就比较不太合适了,当然也可以对应平台加载对应的模型的方法,但是模型效果就需要对应平台单独微调了,还是全平台统一模型可维护性更高。所以这里单独补充MeshOpt asm版的decode性能但是有了奇怪的发现:第一次解析耗时很高,但是大概第3次接近未压缩的性能,第五次接近wasm的性能,这是为什么呢?是否说明一个潜在的优化方法呢?先看看火狐的这个第一个支持ASM的浏览器如何,是否有类似的情况出现?貌似在这个情况下火狐对js执行比chrome强不少,wasm反而没带来更好的效果,但是还是出现了类似的规律,是否说明decoder是需要一个预热,告诉浏览器decode的代码需要特殊优化?所以这个通过加载一个1.21kb的Triangle-meshopt.glb,5次,再加载测试模型,记录数据貌似莫得效果,估计是warm up的次数没够,Triangle-meshopt.glb,只有3个顶点,执行5次也就15个,量级没上去。从Web 3D是否需要WebAssembly?找到了答案 因为chrome浏览器的v8引擎支持JIT: Just-in-Time compilation,所以js程序的执行性能接近wasm(对于Web 3D程序,性能热点的逻辑会在主循环中多次被执行。而v8会在多次执行后,确定热点代码,会将其优化为字节码;然后从下次执行开始,直接执行字节码) 火狐下asm第一次加载耗时是未压缩的1.5 ~ 2.3倍chrome下asm第一次加载耗时是未压缩的3.08 ~ 4.4倍当然由于只是微信小程序IOS下,IPhone的CPU本身比较好,所以还能接受,如果能找到warm up方法,第1次加载耗时等于第5次的就更好了。缺点向量化毕竟是丢失精度的有损压缩方法,但是也正如KHR_mesh_quantization所介绍,是一个精度和大小的妥协 Vertex attributes are usually stored using FLOAT component type. However, this can result in excess precision and increased memory consumption and transmission size, as well as reduced rendering performance. KHR_mesh_quantization的缺点是向量化参数固定,无法修改,好处也是,无需额外decoder,而EXT_meshopt_compression则其升级版,可自定义向量化参数,比如法线精度要求高的时候可以增大容量KHR_draco_mesh_compression这个比较知名的扩展,在这次测评下虽然纯顶点的模型压缩比最高,但是相比之下,其decoder大小和decode性能均不突出。KHR_mesh_quantization和EXT_meshopt_compression都是固定转换,比如模型本身如果尺寸很小,其使用到的浮点数范围也很小,这时候丢失精度的情况就比较大了,解决办法除了增加存储的容量,更简单的其实是,放大模型,让顶点之间的距离变大,使用的时候再缩小即可。文本描述可能没有那么直观还是看动图吧。模型放大10倍后,不是同一个模型版本忽略颜色变化中间包包的差异基本可以忽略不计,但是下面还是有纹理偏移出现。猜想未来改进方向由上面的固定向量化导致模型处于小浮点数范围出现的误差问题可以推测下一步可以优化:动态向量化+偏移,目测可以进一步提供精度和压缩比,但是decoder的耗时会增加。比如把模型的BoundingBox.xyz最大值作为映射到0-1,再映射到整型/自定义XByte,当然模型里面的子mesh也可以如此,也可以xyz分别维护等等。当然只是想法,本文其实目的就是因为发现一个牛皮的扩展MeshOpt,但是想相对严谨去测试验证引入到项目可用性的,也是一个探索的过程。总结MeshOpt牛皮发布于 2021-03-26 23:29three.jsWebGL​赞同 24​​2 条评论​分享​喜欢​收藏​申请

压缩gltf/glb模型踩坑与解决 three.js DRACOLoader - 掘金

压缩gltf/glb模型踩坑与解决 three.js DRACOLoader - 掘金

首页 首页

沸点

课程

直播

活动

竞赛

商城

APP

插件 搜索历史

清空

创作者中心

写文章 发沸点 写笔记 写代码 草稿箱 创作灵感

查看更多

会员

登录

注册

压缩gltf/glb模型踩坑与解决 three.js DRACOLoader

lgldl

VIP.5 如鱼得水

2022-03-08

2,870

前言

使用前端three.js加载3d模型过程中,往往会出现模型大小过大导致前端加载时间过长,降低用户体验。

本文所记录的是笔者在使用gltf-pipeline压缩3d模型中踩坑DRACOLoader与解决的一个过程。

所采用的three库版本为 ^0.138.2

解决方案与介绍

通过gltf-pipeline可以大幅度压缩gltf/glb模型文件。

并且有如下的作用

将 glTF 转换为 glb(和反向)

将缓冲区/纹理保存为嵌入或单独的文件

将 glTF 1.0 模型转换为 glTF 2.0(使用KHR_techniques_webgl和KHR_blend扩展)

应用Draco网格压缩

安装

npm install -g gltf-pipeline

或者

yarn global add gltf-pipeline

常用压缩命令

gltf-pipeline -i model.glb -o modelDraco.glb -d

使用 Draco 压缩网格 model.glb 文件,modelDraco.glb为压缩后输出文件名

gltf-pipeline -i model.glb -o modelDraco.glb -d -s

压缩并编写单独的缓冲区、着色器和纹理。

在three.js中使用Draco压缩网格后的文件

坑与解决过程

在多次百度之后写出的代码

let dracoLoader = new DRACOLoader();

dracoLoader.setDecoderPath("path");

dracoLoader.preload();

const loader = new GLTFLoader().setPath("path");

loader.setDRACOLoader(dracoLoader);

loader.load("modelName", (gltf) => {

scene.addObject(gltf.scene);

gltf = null;

});

在这里我遇到了一个大坑:

Uncaught SyntaxError: Unexpected token '<'

解决:

在问题过程排查中,发现网络请求是请求了模型数据的

后续发现bolb:xxx的请求不是写的应用层所发出的

之后通过阅读DRACOLoader.js的源码得

网络请求中bolb:xxx请求是由第250行URL.createObjectURL所创建的,创建该请求需要

draco_decoder.js

draco_wasm_wrapper.js

draco_decoder.wasm

并且请求的路径是使用setDecoderPath方法所设定

后续查阅资料得到

draco_decoder.js— Emscripten 编译的解码器,与任何现代浏览器兼容。

draco_decoder.wasm— WebAssembly 解码器,与较新的浏览器和设备兼容。

draco_wasm_wrapper.js— WASM 解码器的 JavaScript 包装器。

在node_modules安装的包中获取three版本对应的draco路径为

node_modules\three\examples\js\libs

将改文件夹复制到public文件夹下并在DRACOLoader.setDecoderPath时候设置该对应路径即可

最后的解决代码与自己的封装

import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";

import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";

/**

*

* path:存放模型父路径

* modelName:模型名

* setCenter:是否居中

* scale:模型的缩放比设定

* position:模型的位置

* rotation:模型的局部旋转

*/

function loadModuleByDRACOLoader(

path,

modelName,

setCenter,

scale,

position,

rotation

) {

let scaleVec3, positionVec3;

if (typeof scale == "number") {

scaleVec3 = new THREE.Vector3(scale, scale, scale);

} else {

scaleVec3 = new THREE.Vector3(scale.x, scale.y, scale.z);

}

if (typeof position == "number") {

positionVec3 = new THREE.Vector3(position, position, position);

} else {

positionVec3 = new THREE.Vector3(position.x, position.y, position.z);

}

let dracoLoader = new DRACOLoader();

dracoLoader.setDecoderPath("./moduler/draco/"); // 设置public下的解码路径,注意最后面的/

dracoLoader.setDecoderConfig({ type: "js" }); //使用兼容性强的draco_decoder.js解码器

dracoLoader.preload();

const loader = new GLTFLoader().setPath(path);

loader.setDRACOLoader(dracoLoader);

return new Promise((res, rj) => {

loader.load(modelName, (gltf) => {

if (setCenter) {

gltf.scene.traverse(function(child) {

if (setCenter && child.isMesh) {

child.geometry.center();

}

});

}

gltf.scene.scale.copy(scaleVec3);

gltf.scene.position.copy(positionVec3);

if (rotation) {

gltf.scene.rotation.copy(rotation);

}

scene.add(gltf.scene);

res(gltf.scene);

gltf = null;

});

});

}

调用

loadModuleByDRACOLoader('./moduler/', "grow4-processed.glb", false, 1, 0)

结语

因为遇到这个坑之后没有找到对应的解决方法,所以写了该文章作为记录也给遇到相同问题的开发者避坑。

还有大三求内推

lgldl

学生

3

文章

5.2k

阅读

9

粉丝 目录 收起

前言

解决方案与介绍

安装

常用压缩命令

在three.js中使用Draco压缩网格后的文件

坑与解决过程

解决:

最后的解决代码与自己的封装

结语

相关推荐 还在封装 xxxForm,xxxTable 残害你的同事?试试这个工具 1.9k阅读  ·  26点赞小册上新 | 前端工程体验优化实战 1.4k阅读  ·  1点赞【深圳招聘】凹凸实验室 Taro 团队招人啦! 1.2k阅读  ·  6点赞Modal 管理体操二三事 (实践篇) 411阅读  ·  10点赞前端监控sdk开发(五)白屏检测 82阅读  ·  1点赞 友情链接:

Robert Frost - American Writers 2

2011-中国发展报告

快穿之主神大人有点慌丨穿越丨科幻丨AI专辑

许你惜年时光全文免费阅读

大都市区空间结构与可持续交通

Obstetrics&Gynecology: PreTest Self-Assessment and Review

3D文件压缩库——Draco简析_draco_encoder-CSDN博客

>

3D文件压缩库——Draco简析_draco_encoder-CSDN博客

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

最新推荐文章于 2023-12-14 10:27:14 发布

夕阳叹

最新推荐文章于 2023-12-14 10:27:14 发布

阅读量1.5w

收藏

38

点赞数

5

分类专栏:

Android图形显示

文章标签:

压缩

3D

VR

AR

模型

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/jxt1234and2010/article/details/53999155

版权

Android图形显示

专栏收录该内容

24 篇文章

63 订阅

订阅专栏

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 = 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文件包含顶点信息和面的信息。 这两者的联系如图所示: 顶点信息就是该点的物体坐标、法线向量、纹理坐标等,如果绑定了骨骼,还有各块骨骼的权重。 面的信息指怎么由顶点围成面,它是一系列顶点索引的集合。如 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相关的资源大头(图片)还是一个老大难的问题。

优惠劵

夕阳叹

关注

关注

5

点赞

38

收藏

觉得还不错?

一键收藏

知道了

5

评论

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

3D文件压缩库——Draco简析今年1月份时,google发布了名为“Draco”的3D图形开源压缩库,下载了其代码来看了下,感觉虽然暂时用不到,但还是有前途的,故简单做下分析。注:Draco 代码地址: https://github.com/google/draco基本使用编译cmake . + make 编译源码,生成 draco_encoder 和 draco_decoder 两个可执行文件

复制链接

扫一扫

专栏目录

3D图形开源压缩库Draco.zip

07-19

Draco 是一种库,用于压缩和解压缩 3D 几何网格(geometric mesh)和点云(point cloud)。换句话说,它显著缩小了 3D 图形文件的大小,同时对 3D 图形的观看者来说又根本不严重影响视觉效果。它还旨在改善 3D 图形的压缩和传输。 来自谷歌 Chrome Media 团队的贾米森·布雷特勒(Jamieson Brettle)和法兰克·加利根(Frank Galligan)在解释 Draco 时说:“Draco 是为了提升压缩效率和速度而设计和研制的。代码支持压缩点、连接信息、纹理坐标、颜色信息、正常量以及与几何形状有关的任何其他一般属性。有了 Draco,使用 3D 图形的应用程序可以小巧得多,又不影响视觉逼真度。对于用户来说,这意味着现在应用程序下载起来更快了,浏览器中的 3D 图形加载起来更快了,现在只需要少量的带宽就可以传输虚拟现实和增强现实了,而且可以迅速呈现、画面极其逼真。”Draco 是作为 C 源代码发布的,可以用来压缩 3D 图形,另外还发布了处理编码数据的 C 和 Javascript 解码器。

标签:Draco

【window环境】已经编译的 draco-1.4.1.zip 对应最新版本 1.4.1

04-25

谷歌开源 draco window环境下已经编译好了,可以直接使用,如果想学linux编译,可以看我的csdn文章

5 条评论

您还未登录,请先

登录

后发表或查看评论

Draco压缩算法使用

春夜喜雨的专栏

10-14

3453

关于Draco压缩算法:Draco是一个开源的Lib库,提供3D图形mesh和点云的压缩和解压。它的目标是提升3D图形的存储和传输效率。

Google 3D压缩项目Draco简析

JM-Nie的博客

08-08

5212

谷歌3D图形压缩库Draco项目简介

...

GLB/GLTF 模型压缩轻量化

最新发布

ygtu2018的博客

12-14

1018

Draco 是用于网格压缩的 glTF 扩展,以及由 Google 开发的开源库,用于压缩和解压缩 3D 网格以显着减小 3D 内容的大小。它压缩顶点位置、法线、颜色、纹理坐标和任何其他通用顶点属性,从而提高通过 Web 传输 3D 内容的效率和速度。

谷歌开源 3D 数据压缩算法 Draco以及代码分析

影音视频技术

11-20

1万+

笨重的显卡、更强大的 CPU、高分辨率显示屏,所有这些都对高品质3D 视觉体验十分重要——无论是对于游戏还是 VR。但如果用户需要等 n 年才能下载好高清内容,数据太大又无法直播,那么所有这一切都变得不重要。这就是为什么互联网巨头们——比如谷歌,会投入巨大时间精力来研究压缩数据的新方法。上周,谷歌发布了一个开源 3D 模型压缩库"Draco",它功能简单但是潜力不可限量。

Draco 由谷歌

Draco库简析

l18850339134的博客

08-04

6555

Draco库简析

一.简介

​ Draco是谷歌Chrome 团队在2017年1月发布的一个Draco是用于压缩和解压缩3D几何网格和点云的库,旨在改善3D图形的存储和传输,大幅加速 3D 数据的编码、传输和解码。这个开源算法的首要应用对象是浏览器。但可以去探索 Draco 在其他场景的应用,比如说非网页端。目前,谷歌提供了它的两个版本: JavaScript 和 C++。

​ Draco 可以被用来压缩 mesh 和点云数据。它还支持压缩点( compressing points),连接信息

GLTF中的Draco编译与测试

06-16

542

GLTF杂碎+Draco编译与测试

前端 3DTiles 效率优化(2)—— 采用 Draco 压缩模型

PHP代码的博客

02-08

1910

前端 3DTiles 效率优化(2)—— 采用 Draco 压缩模型

Cesium开发: Draco模型压缩

PHP代码的博客

02-08

459

Draco 由谷歌 Chrome 媒体团队设计,旨在大幅加速 3D 数据的编码、传输和解码

DracoUnity:Draco 3D数据压缩Unity软件包

05-05

Draco 3D数据压缩Unity软件包

Unity软件包,它将集成到Unity中。

支持以下构建目标

WebGL

iOS(arm64和armv7a)

Android(x86,arm64和armv7a)

Windows(64位和32位)

通用Windows平台(x64,x86,ARM,ARM64)

macOS(Apple Silicon和Intel)

Linux(64位和32位)

正在安装

最简单的安装方法是下载并打开

它运行一个脚本,该脚本通过来安装Draco 3D数据压缩Unity软件包。 之后,它会在“程序包管理器”中列出,并可从那里进行更新。

故障排除-缺少代码签名

此程序包中使用的二进制库没有代码签名。 出于这个原因,特别是macOS不允许您加载ktx_unity.bundle (请参阅)。

这是使其在macOS上运行的步骤

首次使用DracoUnity打开项目

draco编译后exe 3D压缩

01-10

Draco将会在3D设计的传输中产生重大影响,例如在VR和AR中使用的3D设计。加入3D观看者的进度,例如用于HoloLens的SketchUp的观看者,这将使得对象被发送和接收更快。此外,通过发布开源代码,Google已允许用户下载并使用离线功能进行自己压缩。

Draco decoder.rar

05-17

最新版谷歌Draco开源算法的windows编译可执行程序,通过cmd命令将obj模型压缩为drc文件,大幅减少文件大小,已测试可用

draco:Draco是用于压缩和解压缩3D几何网格和点云的库。 旨在改善3D图形的存储和传输

02-26

消息

版本1.4.1发行

现在建议使用版本化的gstatic.com WASM和Javascript解码器。 要使用v1.4.1,请使用以下URL:

*

将*替换为要加载的文件。 例如

这适用于v1.3.6和v1.4.0发行版,并将与将来的Draco发行版一起使用。

Bug修复

1.4.0版发行

WASM和JavaScript解码器是从静态URL托管的。

建议始终从此URL提取Draco WASM和JavaScript解码器:

*

将*替换为要加载的文件。 例如

随着更多站点开始使用静态URL,用户将受益于将Draco解码器缓存在缓存中

更改了npm模块以使用WASM,从而使性能提高了约200%。

将Emscripten更新为2.0。

这将导致Draco编解码器模块返回一个Promise,而不是直接返回该模块。

请查看有关如何处理承诺的示例代码。

将NORMAL

drcobj:使用 draco 压缩和解压 three.js 模型文件。(Use draco to compress and decompress threejs-object files.)

04-29

Draco是用于压缩和解压缩3D几何网格和点云的开源库。 旨在改善3D图形的存储和传输。 您可以使用drcobj_exporter.js将threejs-object(.json)文件转换为draco压缩的threejs-object(.drcobj)文件, drcobj_loader....

OpenGL的替代者——Vulkan

热门推荐

jxt1234and2010的专栏

12-20

1万+

OpenGL的替代者——VulkanVulkan是一个跨平台的2D和3D绘图应用程序接口(API),最早由科纳斯(Khronos)组织在2015年游戏开发者大会(GDC)上发表。旨在替代OpenGL,提高图形性能。基于OpenGL的图形引擎性能瓶颈基于OpenGL的图形引擎,其渲染过程粗略可分为 主机端资源准备,设备端数据交互与管线准备 及 每帧循环的渲染 三个部分。

资源加载这一过程跟GPU没有

ETC1压缩纹理格式详解

jxt1234and2010的专栏

10-14

1万+

本来以为,ETC1作为Android 设备的OpenGL标准,开源且最常用的的一种压缩纹理格式,总会有人去翻译一下khronos的文档,读一下代码,给大家作个普及的,不料就是搜不到。没办法,尽管英文不好,还是硬啃了下文档,把 ETC1压缩纹理的实现原理弄清楚了。

https://www.khronos.org/registry/gles/extensions/OES/OES_compressed_

Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)

jxt1234and2010的专栏

05-27

1万+

Android显示之图层合成要点1.图层合成指综合各个窗口的绘制内容,送往LCD显示的过程。从原理上可分为在线合成与离线合成两种方式。

2.在Android的SurfaceFlinger代码流程中,图层合成方式分3D合成(OpenGL)和硬件合成两大类。

3.图形系统采用垂直同步Vsync机制,由LCD上报vsync,触发图层合成。图层合成的原理什么是图层合成以Android原生版本的Launc

draco与其他压缩算法对比

06-02

Draco是一种基于点的压缩算法,专门用于3D图形数据的压缩。与其他压缩算法相比,Draco具有以下优点:

1. 高压缩率:Draco具有很高的压缩率,可以将3D图形数据压缩到很小的文件大小。

2. 快速解压缩:Draco的解压缩速度非常快,可以在瞬间解压缩3D图形数据。

3. 没有质量损失:Draco可以在压缩3D图形数据的同时保持数据的准确性和完整性,不会出现质量损失。

4. 支持多种数据类型:Draco可以压缩多种类型的3D图形数据,包括点云、曲面、网格等。

5. 开源免费:Draco是一个开源的压缩算法,可以免费使用和修改。

相比之下,其他压缩算法可能不专门针对3D图形数据,压缩率和解压缩速度也可能不如Draco。同时,其他压缩算法可能存在数据损失或者需要付费使用的情况。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

夕阳叹

CSDN认证博客专家

CSDN认证企业博客

码龄12年

暂无认证

55

原创

1万+

周排名

7万+

总排名

34万+

访问

等级

4047

积分

505

粉丝

224

获赞

118

评论

500

收藏

私信

关注

热门文章

GPU与GPGPU泛淡

22630

OpenGL的替代者——Vulkan

18882

ETC1压缩纹理格式详解

17594

Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)

17137

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

15446

分类专栏

Skia深入分析

11篇

Android图形显示

24篇

机器学习

8篇

异构计算/算法优化

14篇

Renascence

7篇

最新评论

ETC1压缩纹理格式详解

no_sang:

博主,有没有关于ETC压缩与解压缩的文件数据,好难找,求求了。邮箱yl18291006439 @163.com

从软件工程的角度写机器学习5——SVM(支持向量机)实现

缘起猿灭:

这是论文吗,请问名字叫什么呢

SIMD优化之ARM纯汇编开发

K .:

早关注了MNN,总归是没啥发文了

SIMD优化之ARM纯汇编开发

Joker.一只小菜鸡:

博主搞开源框架MNN去了, 快去star哈哈

SIMD优化之ARM纯汇编开发

K .:

所有文章都拜读了一遍,难见文章质量这么高的博主,发文越来越少,可惜可惜。

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

移动端推理引擎通用性小测

【水文】基于 MNN 训练能力解方程

SIMD优化之ARM纯汇编开发

2023年2篇

2020年2篇

2019年3篇

2017年4篇

2016年15篇

2015年29篇

目录

目录

分类专栏

Skia深入分析

11篇

Android图形显示

24篇

机器学习

8篇

异构计算/算法优化

14篇

Renascence

7篇

目录

评论 5

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

谷歌开源 3D 数据压缩算法 Draco以及代码分析_draco压缩-CSDN博客

>

谷歌开源 3D 数据压缩算法 Draco以及代码分析_draco压缩-CSDN博客

谷歌开源 3D 数据压缩算法 Draco以及代码分析

最新推荐文章于 2023-12-14 10:27:14 发布

coloriy

最新推荐文章于 2023-12-14 10:27:14 发布

阅读量1.1w

收藏

36

点赞数

1

分类专栏:

媒体格式

编解码

3D

媒体格式

同时被 3 个专栏收录

49 篇文章

3 订阅

订阅专栏

编解码

36 篇文章

2 订阅

订阅专栏

3D

3 篇文章

0 订阅

订阅专栏

笨重的显卡、更强大的 CPU、高分辨率显示屏,所有这些都对高品质3D 视觉体验十分重要——无论是对于游戏还是 VR。但如果用户需要等 n 年才能下载好高清内容,数据太大又无法直播,那么所有这一切都变得不重要。这就是为什么互联网巨头们——比如谷歌,会投入巨大时间精力来研究压缩数据的新方法。上周,谷歌发布了一个开源 3D 模型压缩库"Draco",它功能简单但是潜力不可限量。

Draco 由谷歌 Chrome 媒体团队设计,旨在大幅加速 3D 数据的编码、传输和解码。因为研发团队的 Chrome 背景,这个开源算法的首要应用对象是浏览器。但既然谷歌把它开源,现在全世界的开发者可以去探索 Draco 在其他场景的应用,比如说非网页端。目前,谷歌提供了它的两个版本: JavaScript 和 C++。

Draco 可以被用来压缩 mesh 和点云数据。它还支持压缩点( compressing points),连接信息,纹理协调,颜色信息,法线( normals)以及其他与几何相关的通用属性。下面是谷歌官方发布的 Draco Mesh 文件压缩率,可以看出,它大幅优于 ZIP。

图一:Draco 压缩率与 ZIP 之间的比较

注:第一行为未压缩数据

图二:Draco 编码/解码性能

谷歌宣称,若使用 Draco,含 3D 图像的应用,其文件大小能大幅缩小,并不在视觉保真度上做妥协。对于用户来说,这意味着 app 下载会更快,浏览器的 3D 图像载入得更快,VR 和 AR 画面的传输只需要占用原先一小部分的带宽、渲染得更快并且看起来画质清晰。

另外,在 Draco JavaScript 解码器支持下,传输 3D 图像的网页应用会变得非常地快;而该解码器可以和 3D 网页浏览器绑定起来。这意味着 Draco 普及之后,天朝网速拖后腿的广大群众都可以享受到在线看高清影视带来的满满幸福感。让所有连接网络的用户都能享受到高清视觉体验,正是 Draco 的使命之一。

Draco 的算法既支持有损模式,也支持无损。这给普通消费者带来的好处还不太明显——毕竟大多数人对分辨率并没有强迫症,有损压缩带来的轻微画质改变完全在承受范围之内。但对专业应用和科研应用的意义就很大了。这就好比  JPEG 之于 PNG。后者用于游戏和 VR 应用完全没有问题,降低的画质很难用肉眼察觉。但在科研点云数据中,任何信息都不能丢失。

 

http://betanews.com/2017/01/13/google-draco-3d-graphics-open-source-github/

Google releases 'Draco' 3D graphics open source compression library on GitHub

Google is a significant contributor to the open source community. This is notable, as the company is wildly successful and its products are used by many. It incorporates open source code in its offerings, and then contributes back too. The search giant's visibility lends credibility to open source ideology.

Today, Google announces yet another open source project. Called "Draco," it is a compression library designed for 3D graphics. The project can dramatically reduce the size of 3D graphic files without significant visual impact to the person viewing.

"The Chrome Media team has created Draco, an open source compression library to improve the storage and transmission of 3D graphics. Draco can be used to compress meshes and point-cloud data. It also supports compressing points, connectivity information, texture coordinates, color information, normals and any other generic attributes associated with geometry," says Jamieson Brettle and Frank Galligan, Chrome Media Team, Google.

Brettle and Galligan explain, "With Draco, applications using 3D graphics can be significantly smaller without compromising visual fidelity. For users this means apps can now be downloaded faster, 3D graphics in the browser can load quicker, and VR and AR scenes can now be transmitted with a fraction of the bandwidth, rendered quickly and look fantastic."

You can see Draco in action below. If you want to check out the code, you can view the open source project on GitHub here.

Draco encode过程代码分析 - 探究其数据编码方式

Introduction

Draco是谷歌在2017年1月发布的一个3D图形开源压缩库,提供了多种算法进行压缩和解压缩。  对于encoder过程,Draco整体思路是将网格的连接信息和几何信息进行分别编码并进行存储。  其中,连接信息使用了edgebreaker等算法进行了编码压缩,几何信息对数据进行量化、预测压缩、熵编码。其中熵编码采用了rANS算法。  不过和原先预想的不同,Draco并未建立一张静态查询表,而是利用算法动态地生成。  本文从encoder入口开始,一层一层分析其代码,试图弄清其数据编码方式。  github源码: https://github.com/google/draco

encoder 过程

encode 过程入口

…/tools/draco_encoder.cc: int main()

int main(int argc, char **argv) {

Options options;

const int argc_check = argc - 1;

for (int i = 1; i < argc; ++i) {

if (!strcmp("-h", argv[i]) || !strcmp("-?", argv[i])) {

Usage();

return 0;

} else if (!strcmp("-i", argv[i]) && i < argc_check) {

options.input = argv[++i];

} else if (!strcmp("-o", argv[i]) && i < argc_check) {

options.output = argv[++i];

} else if (!strcmp("-point_cloud", argv[i])) {

options.is_point_cloud = true;

} else if (!strcmp("-qp", argv[i]) && i < argc_check) {

options.pos_quantization_bits = StringToInt(argv[++i]);

if (options.pos_quantization_bits > 31) {

printf(

"Error: The maximum number of quantization bits for the position "

"attribute is 31.\n");

return -1;

}

} else if (!strcmp("-qt", argv[i]) && i < argc_check) {

options.tex_coords_quantization_bits = StringToInt(argv[++i]);

if (options.tex_coords_quantization_bits > 31) {

printf(

"Error: The maximum number of quantization bits for the texture "

"coordinate attribute is 31.\n");

return -1;

}

} else if (!strcmp("-qn", argv[i]) && i < argc_check) {

options.normals_quantization_bits = StringToInt(argv[++i]);

if (options.normals_quantization_bits > 31) {

printf(

"Error: The maximum number of quantization bits for the normal "

"attribute is 31.\n");

return -1;

}

} else if (!strcmp("-cl", argv[i]) && i < argc_check) {

options.compression_level = StringToInt(argv[++i]);

}

}

if (argc < 3 || options.input.empty()) {

Usage();

return -1;

}

std::unique_ptr pc;

draco::Mesh *mesh = nullptr;

if (!options.is_point_cloud) {

std::unique_ptr in_mesh =

draco::ReadMeshFromFile(options.input);

if (!in_mesh) {

printf("Failed loading the input mesh.\n");

return -1;

}

mesh = in_mesh.get();

pc = std::move(in_mesh);

} else {

pc = draco::ReadPointCloudFromFile(options.input);

if (!pc) {

printf("Failed loading the input point cloud.\n");

return -1;

}

}

// Setup encoder options.

draco::EncoderOptions encoder_options = draco::CreateDefaultEncoderOptions();

if (options.pos_quantization_bits > 0) {

draco::SetNamedAttributeQuantization(&encoder_options, *pc.get(),

draco::GeometryAttribute::POSITION,

options.pos_quantization_bits);

}

if (options.tex_coords_quantization_bits > 0) {

draco::SetNamedAttributeQuantization(&encoder_options, *pc.get(),

draco::GeometryAttribute::TEX_COORD,

options.tex_coords_quantization_bits);

}

if (options.normals_quantization_bits > 0) {

draco::SetNamedAttributeQuantization(&encoder_options, *pc.get(),

draco::GeometryAttribute::NORMAL,

options.normals_quantization_bits);

}

// Convert compression level to speed (that 0 = slowest, 10 = fastest).

const int speed = 10 - options.compression_level;

draco::SetSpeedOptions(&encoder_options, speed, speed);

if (options.output.empty()) {

// Create a default output file by attaching .drc to the input file name.

options.output = options.input + ".drc";

}

PrintOptions(*pc.get(), options);

int ret = -1;

if (mesh && mesh->num_faces() > 0)

ret = EncodeMeshToFile(*mesh, encoder_options, options.output);

else

ret = EncodePointCloudToFile(*pc.get(), encoder_options, options.output);

if (ret != -1 && options.compression_level < 10) {

printf(

"For better compression, increase the compression level '-cl' (up to "

"10).\n\n");

}

return ret;

}

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109

这一部分前大半都是在处理命令,核心代码就是最后两行:

if (mesh && mesh->num_faces() > 0)

ret = EncodeMeshToFile(*mesh, encoder_options, options.output);

else

ret = EncodePointCloudToFile(*pc.get(), encoder_options, options.output);

1234

这里先做判断,判断数据中是否有多个面:

如果有面,则进行Mesh to File的过程若不存在面,则只进行PointCloud to File的过程

其中,两个函数都会一个bool变量,来表示是否成功  >  PointCloud是n维空间中的点的集合,PointCloud的相关信息在 …/point_cloud/point_cloud.h 中,内容较多,暂不贴出  而Mesh是PointCloud的继承类,Mesh只是比PointCloud多了Face数据:  …/mesh/mesh.h

class Mesh : public PointCloud {

public:

typedef std::array Face;

Mesh();

void AddFace(const Face &face) { faces_.push_back(face); }

void SetFace(FaceIndex face_id, const Face &face) {

if (face_id >= faces_.size()) {

faces_.resize(face_id.value() + 1, Face());

}

faces_[face_id] = face;

}

1234567891011

MeshToFile

接下来分析MeshToFile过程

int EncodeMeshToFile(const draco::Mesh &mesh,

const draco::EncoderOptions &options,

const std::string &file) {

draco::CycleTimer timer;

// Encode the geometry.

draco::EncoderBuffer buffer;

timer.Start();

if (!draco::EncodeMeshToBuffer(mesh, options, &buffer)) {

printf("Failed to encode the mesh.\n");

return -1;

}

timer.Stop();

// Save the encoded geometry into a file.

std::ofstream out_file(file, std::ios::binary);

if (!out_file) {

printf("Failed to create the output file.\n");

return -1;

}

out_file.write(buffer.data(), buffer.size());

printf("Encoded mesh saved to %s (%" PRId64 " ms to encode)\n", file.c_str(),

timer.GetInMs());

printf("\nEncoded size = %zu bytes\n\n", buffer.size());

return 0;

}

123456789101112131415161718192021222324

这里可以分为两步:

调用 draco::EncodeMeshToBuffer 将 Mesh encode 并存入buffer中将buffer内容调用系统i/o写入file中

这里draco::EncodeMeshToBuffer的前两个参数是输入,第三个参数是输出,即buffer

draco::EncodeMeshToBuffer

这个函数的功能是根据option选择相应的encoder并进行编码,将结果存入buffer中  先来看下整个函数:  …/compression/encode.cc

bool EncodeMeshToBuffer(const Mesh &m, const EncoderOptions &options,

EncoderBuffer *out_buffer) {

std::unique_ptr encoder;

// Select the encoding method only based on the provided options.

int encoding_method = options.GetGlobalInt("encoding_method", -1);

if (encoding_method == -1) {

// For now select the edgebreaker for all options expect of speed 10

if (options.GetSpeed() == 10) {

encoding_method = MESH_SEQUENTIAL_ENCODING;

} else {

encoding_method = MESH_EDGEBREAKER_ENCODING;

}

}

if (encoding_method == MESH_EDGEBREAKER_ENCODING) {

encoder = std::unique_ptr(new MeshEdgeBreakerEncoder());

} else {

encoder = std::unique_ptr(new MeshSequentialEncoder());

}

if (encoder)

encoder->SetMesh(m);

return EncodeGeometryToBuffer(encoder.get(), options, out_buffer);

}

12345678910111213141516171819202122

这个函数前面一部分都在处理option,根据option选择哪种encoder:

Sequential encodingEdgebreaker encoding

if (encoding_method == MESH_EDGEBREAKER_ENCODING) {

encoder = std::unique_ptr(new MeshEdgeBreakerEncoder());

} else {

encoder = std::unique_ptr(new MeshSequentialEncoder());

}

12345

然后利用encoder->SetMesh(const Mesh &m)来对encoder内部的一些数据进行了初始化  >  就是把Mesh和CloudPoint信息在Encoder里也存了一下  …/compression/mesh/mesh_encoder.cc

void MeshEncoder::SetMesh(const Mesh &m) {

mesh_ = &m;

SetPointCloud(m);

}

1234

…/compression/point_cloud/point_cloud_encoder.cc

void PointCloudEncoder::SetPointCloud(const PointCloud &pc) {

point_cloud_ = &pc;

}

123

(这里因为Mesh是PointCloud的继承,所以直接把Mesh数据传进SetPointCloud函数了)

最后进行了几何信息的编码,这是这个函数的核心代码,之前都没干什么正事,这里进行了真正的编码

return EncodeGeometryToBuffer(encoder.get(), options, out_buffer);

1

这个函数从encoder中拿到encoder的指针,进行相应操作,然后将结果写入buffer中

EncodeGeometryToBuffer

…/compression/encode.cc

bool EncodeGeometryToBuffer(PointCloudEncoder *encoder,

const EncoderOptions &options,

EncoderBuffer *out_buffer) {

if (!encoder)

return false;

if (!EncodeHeader(*encoder, out_buffer))

return false;

if (!encoder->Encode(options, out_buffer))

return false;

return true;

}

1234567891011

这里首先用EncoderHeader将encoder的一些基本信息写入buffer,以便今后decode  这些信息包括:”DRACO”字符串标识、major version、minor version、encoder type(point cloud, mesh, …)、selected encoding method (edgebreaker, etc…)、保留标识

然后用encoder->Encode根据option对数据进行编码,写入buffer

encoder->Encode

在这个函数中,具体对encoder data、geometry data、point atrributes进行了编码  …/compression/point_cloud/point_cloud_encoder.cc

bool PointCloudEncoder::Encode(const EncoderOptions &options,

EncoderBuffer *out_buffer) {

options_ = &options;

buffer_ = out_buffer;

// Cleanup from previous runs.

attributes_encoders_.clear();

attribute_to_encoder_map_.clear();

attributes_encoder_ids_order_.clear();

if (!point_cloud_)

return false;

if (!InitializeEncoder())

return false;

if (!EncodeEncoderData())

return false;

if (!EncodeGeometryData())

return false;

if (!EncodePointAttributes())

return false;

return true;

}

12345678910111213141516171819202122

这里InitializeEncoder的功能是  >  Can be implemented by derived classes to perform any custom initialization of the encoder. Called in the Encode() method.

EncodeEncoderData的功能是  >  Should be used to encode any encoder-specific data.

不过这两个都是预留接口,设置了虚函数但没有实现,直接返回true

EncoderGeometryData()会把mesh 的 connectivity进行编码并存入buffer,根据encoder的不同,编码connectivity的方式会分为sequential encoding 和 edgebreaker encoding。  这里暂时先暂停对connectivity编码过程的进一步探究,先研究顶点坐标等信息是如何压缩编码的

EncodePointAttributes

这里point attributes 的意思是  >  point specific data about each attribute. In general, multiple points stored in a point cloud can share the same attribute value and this class provides the necessary mapping between point ids and attribute value ids.

是顶点坐标一类的信息

…/compression/point_cloud/point_cloud_encoder.cc

bool PointCloudEncoder::EncodePointAttributes() {

if (!GenerateAttributesEncoders())

return false;

// Encode the number of attribute encoders.

buffer_->Encode(static_cast(attributes_encoders_.size()));

// Initialize all the encoders (this is used for example to init attribute

// dependencies, no data is encoded in this step).

for (auto &att_enc : attributes_encoders_) {

if (!att_enc->Initialize(this, point_cloud_))

return false;

}

// Rearrange attributes to respect dependencies between individual attributes.

if (!RearrangeAttributesEncoders())

return false;

// Encode any data that is necessary to create the corresponding attribute

// decoder.

for (int att_encoder_id : attributes_encoder_ids_order_) {

if (!EncodeAttributesEncoderIdentifier(att_encoder_id))

return false;

}

// Also encode any attribute encoder data (such as the info about encoded

// attributes).

for (int att_encoder_id : attributes_encoder_ids_order_) {

if (!attributes_encoders_[att_encoder_id]->EncodeAttributesEncoderData(

buffer_))

return false;

}

// Lastly encode all the attributes using the provided attribute encoders.

if (!EncodeAllAttributes())

return false;

return true;

}

1234567891011121314151617181920212223242526272829303132333435363738

Initialize() 初始化值传递 将值传入AttributesEncoder中

RearrangeAttributesEncoders()  (有待仔细求证)  这里主要考虑了不止有顶点信息这一种attribute,可能还有color等attribute,而这里的作用就是把这些attribute的encoder排好序。  暂不继续探究,继续探究float数据是如何储存的

EncodeAttributesEncoderIdentifier是一个预留接口,无实质内容,直接返回true

然后用每一种attribute encoder,对attribute的一些基本信息进行编码和记录。  基本信息包括:attribute number、attribute type、data type、components count等

最后用EncodeAllAttributes对数据进行编码

bool PointCloudEncoder::EncodeAllAttributes() {

for (int att_encoder_id : attributes_encoder_ids_order_) {

if (!attributes_encoders_[att_encoder_id]->EncodeAttributes(buffer_))

return false;

}

return true;

}

1234567

EncodeAttributes()是多态的,框架目前实现了SequentialAttributeEncodersController和KdTreeAttributesEncoder两种encoder,我们选前者进行讨论

SequentialAttributeEncodersController

…/compression/attributes/sequential_attribute_encoders_controller.cc

bool SequentialAttributeEncodersController::EncodeAttributes(

EncoderBuffer *buffer) {

if (!sequencer_ || !sequencer_->GenerateSequence(&point_ids_))

return false;

for (uint32_t i = 0; i < sequential_encoders_.size(); ++i) {

if (!sequential_encoders_[i]->Encode(point_ids_, buffer))

return false;

}

return true;

}

12345678910

(这里不明白哪来那么多sequential_encoders…还有哪些sequential_encoders)

继续深一层 SequentialAttributeEncoder::Encode

SequentialAttributeEncodersController

…/compression/attributes/sequential_attribute_encoders_encoder.cc

bool SequentialAttributeEncoder::Encode(

const std::vector &point_ids, EncoderBuffer *out_buffer) {

if (!EncodeValues(point_ids, out_buffer))

return false;

if (is_parent_encoder_ && IsLossyEncoder()) {

if (!PrepareLossyAttributeData())

return false;

}

return true;

}

12345678910

这里又是一层封装 而后面的is_parent_encoder是与预测有关,IsLossyEncoder是拓展接口,未实现,直接返回false

深入EncodeValues

EncodeValues

…/compression/attributes/sequential_attribute_encoder.cc

bool SequentialAttributeEncoder::EncodeValues(

const std::vector &point_ids, EncoderBuffer *out_buffer) {

const int entry_size = attribute_->byte_stride();

const std::unique_ptr value_data_ptr(new uint8_t[entry_size]);

uint8_t *const value_data = value_data_ptr.get();

// Encode all attribute values in their native raw format.

for (uint32_t i = 0; i < point_ids.size(); ++i) {

const AttributeValueIndex entry_id = attribute_->mapped_index(point_ids[i]);

attribute_->GetValue(entry_id, value_data);

out_buffer->Encode(value_data, entry_size);

}

return true;

}

12345678910111213

该函数根据index将atrribute的值取出,然后存入buffer  >  这里out_buffer->Encode是直接将内容插入buffer末尾,并未进行压缩或编码,可能之后谷歌出2.0还会对这个地方做一些文章吧  …/core/encoder_buffer.h

bool Encode(const void *data, size_t data_size) {

if (bit_encoder_active())

return false;

const uint8_t *src_data = reinterpret_cast(data);

buffer_.insert(buffer_.end(), src_data, src_data + data_size);

return true;

}

1234567

这个地方看起来很纳闷,怎么会没有进行任何压缩呢?  但SequentialAttributeEncoder这个类是这样描述的:  >  A base class for encoding attribute values of a single attribute using a given sequence of point ids. The default implementation encodes all attribute values directly to the buffer but derived classes can perform any custom encoding (such as quantization) by overriding the EncodeValues() method.

查看SequentialAttributeEncoder类就可以发现,它有一些继承  那么到底在哪里决定具体的继承呢?  通过搜索和查找,我们发现在 这个地方 决定了具体是哪个继承类  刚才在PointCloudEncoder::EncodePointAttributes的分析中,没有对Initialize进行仔细分析  …/compression/point_cloud/point_cloud_encoder.cc

// Initialize all the encoders (this is used for example to init attribute

// dependencies, no data is encoded in this step).

for (auto &att_enc : attributes_encoders_) {

if (!att_enc->Initialize(this, point_cloud_))

return false;

}

123456

追踪入Initialize  …/compression/attribute/attribute_encoder.cc

bool AttributesEncoder::Initialize(PointCloudEncoder *encoder,

const PointCloud *pc) {

point_cloud_encoder_ = encoder;

point_cloud_ = pc;

return true;

}

123456

原先以为这就是初始化,仅仅做了一些初始化值传递,但事实上这是一个虚函数  …/compression/attributes/sequential/attribute_encoders_controller.cc

bool SequentialAttributeEncodersController::Initialize(

PointCloudEncoder *encoder, const PointCloud *pc) {

if (!AttributesEncoder::Initialize(encoder, pc))

return false;

if (!CreateSequentialEncoders())

return false;

// Initialize all value encoders.

for (int i = 0; i < num_attributes(); ++i) {

const int32_t att_id = GetAttributeId(i);

if (!sequential_encoders_[i]->Initialize(encoder, att_id))

return false;

}

return true;

}

1234567891011121314

而其中的CreateSequentialEncoders()干了这样一件事:  它用另一个函数CreateSequentialEncoder为每一个attribute建立了一个encoder  …/compression/attributes/sequential/attribute_encoders_controller.cc

equentialAttributeEncodersController::CreateSequentialEncoder(int i) {

const int32_t att_id = GetAttributeId(i);

const PointAttribute *const att = encoder()->point_cloud()->attribute(att_id);

switch (att->data_type()) {

case DT_UINT8:

case DT_INT8:

case DT_UINT16:

case DT_INT16:

case DT_UINT32:

case DT_INT32:

return std::unique_ptr(

new SequentialIntegerAttributeEncoder());

case DT_FLOAT32:

if (encoder()->options()->GetAttributeInt(att_id, "quantization_bits",

-1) > 0) {

if (att->attribute_type() == GeometryAttribute::NORMAL) {

// We currently only support normals with float coordinates

// and must be quantized.

return std::unique_ptr(

new SequentialNormalAttributeEncoder());

} else {

return std::unique_ptr(

new SequentialQuantizationAttributeEncoder());

}

}

break;

default:

break;

}

// Return the default attribute encoder.

return std::unique_ptr(

new SequentialAttributeEncoder());

}

12345678910111213141516171819202122232425262728293031323334

而CreateSequentialEncoder则根据data type建立对应的encoder,目前框架内支持的只有三种:SequentialIntegerAttributeEncoder, SequentialNormalAttributeEncoder, SequentialQuantizationAttributeEncoder

我们可以继续分析EncodeValues了,因为SequentialNormalAttributeEncoder, SequentialQuantizationAttributeEncoder是SequentialIntegerAttributeEncoder的继承类,我们来分析SequentialIntegerAttributeEncoder

SequentialIntegerAttributeEncoder

…/compression/attributes/sequential_integer_attribute_encoder.cc

bool SequentialIntegerAttributeEncoder::EncodeValues(

const std::vector &point_ids, EncoderBuffer *out_buffer) {

// Initialize general quantization data.

const PointAttribute *const attrib = attribute();

if (attrib->size() == 0)

return true;

int8_t prediction_scheme_method = PREDICTION_NONE;

if (prediction_scheme_)

prediction_scheme_method =

static_cast(prediction_scheme_->GetPredictionMethod());

out_buffer->Encode(prediction_scheme_method);

if (prediction_scheme_) {

out_buffer->Encode(

static_cast(prediction_scheme_->GetTransformType()));

}

if (!PrepareValues(point_ids))

return false;

const int num_components = values_.size() / point_ids.size();

// All integer values are initialized. Process them using the prediction

// scheme if we have one.

if (prediction_scheme_) {

prediction_scheme_->Encode(values_.data(), &values_[0], values_.size(),

num_components, point_ids.data());

}

if (prediction_scheme_ == nullptr ||

!prediction_scheme_->AreCorrectionsPositive()) {

ConvertSignedIntsToSymbols(values_.data(), values_.size(),

reinterpret_cast(values_.data()));

}

if (encoder() == nullptr || encoder()->options()->GetGlobalBool(

"use_built_in_attribute_compression", true)) {

out_buffer->Encode(static_cast(1));

if (!EncodeSymbols(reinterpret_cast(values_.data()),

point_ids.size() * num_components, num_components,

out_buffer)) {

return false;

}

} else {

// No compression. Just store the raw integer values, using the number of

// bytes as needed.

// To compute the maximum bit-length, first OR all values.

uint32_t masked_value = 0;

for (uint32_t i = 0; i < values_.size(); ++i) {

masked_value |= values_[i];

}

// Compute the msb of the ORed value.

int value_msb_pos = 0;

if (masked_value != 0) {

value_msb_pos = bits::MostSignificantBit(masked_value);

}

const int num_bytes = 1 + value_msb_pos / 8;

out_buffer->Encode(static_cast(0));

out_buffer->Encode(static_cast(num_bytes));

if (num_bytes == sizeof(decltype(values_)::value_type)) {

out_buffer->Encode(values_.data(), sizeof(int32_t) * values_.size());

} else {

for (uint32_t i = 0; i < values_.size(); ++i) {

out_buffer->Encode(&values_[i], num_bytes);

}

}

}

if (prediction_scheme_) {

prediction_scheme_->EncodePredictionData(out_buffer);

}

return true;

}

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

这里主要做了三件事

预处理数据利用预测压缩数据将int编码为symbol 并利用rANS熵编码算法进行压缩编码

预处理 - PrepareValues  进行一些格式转换等处理,此外,在SequentialQuantizationAttributeEncoder和SequentialNormalAttributeEncoder中,会进行量化

利用预测压缩数据

prediction_scheme_->Encode(values_.data(), &values_[0], values_.size(),

num_components, point_ids.data());

12

目前框架内包含了parallelogram, multi parallelogram, tex coords三种预测方法

进行压缩编码

EncodeSymbols(reinterpret_cast(values_.data()),

point_ids.size() * num_components, num_components,

out_buffer)

123

EncodeSymbols

EncodeSymbols内部是先对待处理数据进行了测算,根据测算结果决定利用哪种熵编码技术

…/core/symbol_encoding.cc

bool EncodeSymbols(const uint32_t *symbols, int num_values, int num_components,

EncoderBuffer *target_buffer) {

if (num_values < 0)

return false;

if (num_values == 0)

return true;

if (num_components <= 0)

num_components = 1;

std::vector bit_lengths;

uint32_t max_value;

ComputeBitLengths(symbols, num_values, num_components, &bit_lengths,

&max_value);

// Compute the total bit length used by all values. This will be used for

// computing a heuristic that chooses the optimal entropy encoding scheme.

uint64_t total_bit_length = 0;

for (size_t i = 0; i < bit_lengths.size(); ++i) {

total_bit_length += bit_lengths[i];

}

const int64_t num_component_values = num_values / num_components;

// The average number of bits necessary for encoding a single entry value.

const int64_t average_bit_length =

static_cast(ceil(static_cast(total_bit_length) /

static_cast(num_component_values)));

// The estimated average number of bits necessary for encoding a single

// bit-length tag.

int64_t average_bits_per_tag = static_cast(

ceil(static_cast(bits::MostSignificantBit(average_bit_length)) /

static_cast(num_components)));

if (average_bits_per_tag <= 0)

average_bits_per_tag = 1;

// Estimate the number of bits needed for encoding the values using the tagged

// scheme. 32 * 8 is the overhead for encoding the entropy encoding table.

const int64_t tagged_scheme_total_bits =

num_component_values *

(num_components * average_bit_length + average_bits_per_tag) +

32 * 8;

// Estimate the number of bits needed by the "raw" scheme. In this case,

// max_value * 8 is the overhead of the entropy table.

const int64_t raw_scheme_total_bits =

num_values * average_bit_length + max_value * 8;

// The maximum bit length of a single entry value that we can encode using

// the raw scheme.

const int max_value_bit_length = bits::MostSignificantBit(max_value) + 1;

if (tagged_scheme_total_bits < raw_scheme_total_bits ||

max_value_bit_length > kMaxRawEncodingBitLength) {

// Use the tagged scheme.

target_buffer->Encode(static_cast(0));

return EncodeTaggedSymbols(

symbols, num_values, num_components, bit_lengths, target_buffer);

}

// Else use the raw scheme.

target_buffer->Encode(static_cast(1));

return EncodeRawSymbols(symbols, num_values, &max_value,

target_buffer);

}

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162

前面大部分都在算各种特征,来决定用哪种scheme

// The maximum bit length of a single entry value that we can encode using

// the raw scheme.

const int max_value_bit_length = bits::MostSignificantBit(max_value) + 1;

if (tagged_scheme_total_bits < raw_scheme_total_bits ||

max_value_bit_length > kMaxRawEncodingBitLength) {

// Use the tagged scheme.

target_buffer->Encode(static_cast(0));

return EncodeTaggedSymbols(

symbols, num_values, num_components, bit_lengths, target_buffer);

}

// Else use the raw scheme.

target_buffer->Encode(static_cast(1));

return EncodeRawSymbols(symbols, num_values, &max_value,

target_buffer);

123456789101112131415

有TaggedSymbols和RawSymbols两种,但是都用了RAnsSymbolEncoder  其中,rANS(Asymmetric Numeral Systems)是一种熵编码,框架参考了http://arxiv.org/abs/1311.2540v2实现

小结

总的来说,Draco整体思路是将网格的连接信息和几何信息进行分别编码并进行存储。  其中,几何信息使用SequentialAttributeEncodersController/KdTreeAttributesEncoder进行编码。而Sequential内部会对数据进行量化、预测压缩、熵编码。其中熵编码采用了rANS算法。  Draco进行了层层封装、科学地使用多态,使得代码层次清晰,可扩展性好,但也带来了一定的阅读障碍。采用的Edgebreaker算法压缩性能方面还有待提升,对float的编码采用动态建立熵编码可能会比较慢,在直播情景下还需要实验验证并改进。

@Woolsey

2017/3/19

版权声明:本文为博主原创文章,未经博主允许不得转载。

优惠劵

coloriy

关注

关注

1

点赞

36

收藏

觉得还不错?

一键收藏

知道了

1

评论

谷歌开源 3D 数据压缩算法 Draco以及代码分析

笨重的显卡、更强大的 CPU、高分辨率显示屏,所有这些都对高品质3D 视觉体验十分重要——无论是对于游戏还是 VR。但如果用户需要等 n 年才能下载好高清内容,数据太大又无法直播,那么所有这一切都变得不重要。这就是为什么互联网巨头们——比如谷歌,会投入巨大时间精力来研究压缩数据的新方法。上周,谷歌发布了一个开源 3D 模型压缩库"Draco",它功能简单但是潜力不可限量。Draco 由谷歌

复制链接

扫一扫

专栏目录

3D图形开源压缩库Draco.zip

07-19

Draco 是一种库,用于压缩和解压缩 3D 几何网格(geometric mesh)和点云(point cloud)。换句话说,它显著缩小了 3D 图形文件的大小,同时对 3D 图形的观看者来说又根本不严重影响视觉效果。它还旨在改善 3D 图形的压缩和传输。 来自谷歌 Chrome Media 团队的贾米森·布雷特勒(Jamieson Brettle)和法兰克·加利根(Frank Galligan)在解释 Draco 时说:“Draco 是为了提升压缩效率和速度而设计和研制的。代码支持压缩点、连接信息、纹理坐标、颜色信息、正常量以及与几何形状有关的任何其他一般属性。有了 Draco,使用 3D 图形的应用程序可以小巧得多,又不影响视觉逼真度。对于用户来说,这意味着现在应用程序下载起来更快了,浏览器中的 3D 图形加载起来更快了,现在只需要少量的带宽就可以传输虚拟现实和增强现实了,而且可以迅速呈现、画面极其逼真。”Draco 是作为 C 源代码发布的,可以用来压缩 3D 图形,另外还发布了处理编码数据的 C 和 Javascript 解码器。

标签:Draco

cpp-Draco是Google开源的3D图形压缩

08-16

Draco是Google开源的3D 图形压缩

1 条评论

您还未登录,请先

登录

后发表或查看评论

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

既然青春留不住,还是做个大叔好!

06-25

1683

此文转自: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

GLB/GLTF 模型压缩轻量化

ygtu2018的博客

12-14

1018

Draco 是用于网格压缩的 glTF 扩展,以及由 Google 开发的开源库,用于压缩和解压缩 3D 网格以显着减小 3D 内容的大小。它压缩顶点位置、法线、颜色、纹理坐标和任何其他通用顶点属性,从而提高通过 Web 传输 3D 内容的效率和速度。

Google 3D压缩项目Draco简析

JM-Nie的博客

08-08

5212

谷歌3D图形压缩库Draco项目简介

...

Draco压缩算法

jadesl的专栏

04-19

2135

Draco压缩算法详解

Draco压缩算法使用

Draco - glTF模型压缩利器

新缸中之脑

07-06

3391

Draco 是用于网格压缩的 glTF 扩展以及由 Google 开发的开源库,用于压缩和解压缩 3D 网格以显着减小 3D 内容的大小。它压缩顶点位置、法线、颜色、纹理坐标和任何其他通用顶点属性,从而提高在网络上传输 3D 内容的效率和速度。

这意味着 更小的文件大小 和 更快的流式传输,尤其是在 3D Tiles 的情况下,当新的图块出现或需要新的细节级别时,它经常流式传输新的 glTF 模型。我们一直在与 Khronos 和 Google 合作使 Draco 成为 glTF 扩展,你现在可以在 Ces

Cesium开发: Draco模型压缩

PHP代码的博客

02-08

459

Draco 由谷歌 Chrome 媒体团队设计,旨在大幅加速 3D 数据的编码、传输和解码

Draco使用笔记(1)——图形解压缩

人生海海 山山而川

05-18

2365

详细论述了使用Draco进行图形解压缩的过程。

使用Draco压缩GLTF模型

GIS小虫的博客

01-17

866

RT

draco:Draco是用于压缩和解压缩3D几何网格和点云的库。 旨在改善3D图形的存储和传输

02-26

消息

版本1.4.1发行

现在建议使用版本化的gstatic.com WASM和Javascript解码器。 要使用v1.4.1,请使用以下URL:

*

将*替换为要加载的文件。 例如

这适用于v1.3.6和v1.4.0发行版,并将与将来的Draco发行版一起使用。

Bug修复

1.4.0版发行

WASM和JavaScript解码器是从静态URL托管的。

建议始终从此URL提取Draco WASM和JavaScript解码器:

*

将*替换为要加载的文件。 例如

随着更多站点开始使用静态URL,用户将受益于将Draco解码器缓存在缓存中

更改了npm模块以使用WASM,从而使性能提高了约200%。

将Emscripten更新为2.0。

这将导致Draco编解码器模块返回一个Promise,而不是直接返回该模块。

请查看有关如何处理承诺的示例代码。

将NORMAL

draco编译后exe 3D压缩

01-10

Draco将会在3D设计的传输中产生重大影响,例如在VR和AR中使用的3D设计。加入3D观看者的进度,例如用于HoloLens的SketchUp的观看者,这将使得对象被发送和接收更快。此外,通过发布开源代码,Google已允许用户下载并使用离线功能进行自己压缩。

DracoUnity:Draco 3D数据压缩Unity软件包

05-05

Draco 3D数据压缩Unity软件包

Unity软件包,它将集成到Unity中。

支持以下构建目标

WebGL

iOS(arm64和armv7a)

Android(x86,arm64和armv7a)

Windows(64位和32位)

通用Windows平台(x64,x86,ARM,ARM64)

macOS(Apple Silicon和Intel)

Linux(64位和32位)

正在安装

最简单的安装方法是下载并打开

它运行一个脚本,该脚本通过来安装Draco 3D数据压缩Unity软件包。 之后,它会在“程序包管理器”中列出,并可从那里进行更新。

故障排除-缺少代码签名

此程序包中使用的二进制库没有代码签名。 出于这个原因,特别是macOS不允许您加载ktx_unity.bundle (请参阅)。

这是使其在macOS上运行的步骤

首次使用DracoUnity打开项目

DRACO:相关数据的数据缩减算法-matlab开发

05-30

相关数据的数据缩减算法

基于springboot+Vue的疫情信息管理系统(Java毕业设计,附源码,数据库).zip

03-05

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

photoshop修图小技巧,gif动画

03-05

photoshop修图小技巧,gif动画

基于springboot+vue的大学生租房平台的设计与实现(Java毕业设计,附源码,数据库).zip

03-05

Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。

包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。

该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。

项目都经过严格调试,确保可以运行!

1. 技术组成

前端:html、javascript、Vue

后台框架:SpringBoot

开发环境:idea

数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)

数据库工具:navicat

部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven

2. 部署

如果部署有疑问的话,可以找我咨询

后台路径地址:localhost:8080/项目名称/admin/dist/index.html

前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

2023最新OneTool多平台助手程序源码 开心可用版本

最新发布

03-05

2023最新OneTool多平台助手程序源码 开心可用版本

OneTool 是一款功能强大的多平台助手,目前最新版本为 199911 (1.9.1)。除此之外,该应用程序还拥有其他好玩的功能,等着您们来搭建测试。

可以帮助用户快速完成各种任务。例如网易云音乐每日签到、每日云贝、打卡 300 首歌曲、音乐人每日任务等;WX 运动健身记步范围设定, QQ 空间秒赞秒评;哔哩哔哩视频短片每日签到、每日在线观看、投币机、动漫作品每日签到、分享视频、天选抽奖活动;百度贴吧签到;爱奇艺 VIP 每日任务、每日抽奖活动、二端每日签到等等,都可以通过 OneTool 进行快速操作。

搭建环境需求:PHP8.0 伪静态设置为thinkphp规则 运行目录设置为public

draco与其他压缩算法对比

06-02

Draco是一种基于点的压缩算法,专门用于3D图形数据的压缩。与其他压缩算法相比,Draco具有以下优点:

1. 高压缩率:Draco具有很高的压缩率,可以将3D图形数据压缩到很小的文件大小。

2. 快速解压缩:Draco的解压缩速度非常快,可以在瞬间解压缩3D图形数据。

3. 没有质量损失:Draco可以在压缩3D图形数据的同时保持数据的准确性和完整性,不会出现质量损失。

4. 支持多种数据类型:Draco可以压缩多种类型的3D图形数据,包括点云、曲面、网格等。

5. 开源免费:Draco是一个开源的压缩算法,可以免费使用和修改。

相比之下,其他压缩算法可能不专门针对3D图形数据,压缩率和解压缩速度也可能不如Draco。同时,其他压缩算法可能存在数据损失或者需要付费使用的情况。

“相关推荐”对你有帮助么?

非常没帮助

没帮助

一般

有帮助

非常有帮助

提交

coloriy

CSDN认证博客专家

CSDN认证企业博客

码龄17年

暂无认证

110

原创

2万+

周排名

104万+

总排名

188万+

访问

等级

1万+

积分

560

粉丝

269

获赞

114

评论

1012

收藏

私信

关注

热门文章

RTC与WebRTC有什么区别

49942

ffmpeg 编码H265和H264对比

31569

mov 和 mp4 格式的区别

30961

Android studio 模拟器报错:E/EGL_emulation: tid 3073: eglSurfaceAttrib(1146): error 0x3009 (EGL_BAD_MATCH)

30713

图像及视频基础知识

30260

分类专栏

工具软件

6篇

QT

1篇

流媒体技术

10篇

解决方案

1篇

数据结构与算法

28篇

Multimedia

120篇

程序设计

33篇

Android

114篇

Linux

23篇

Windows

22篇

PM

4篇

FFmpeg

55篇

Python

18篇

Internet

4篇

Directshow

7篇

rtsp

2篇

Nginx

15篇

流媒体

70篇

服务器

36篇

HLS

20篇

HTML5

1篇

MPEGTS

4篇

WebRTC

4篇

面试

12篇

管理

8篇

网络编程

17篇

NAT

媒体格式

49篇

RTMP

9篇

HEVC

3篇

编解码

36篇

H265

6篇

H264

33篇

MPEG2TS

1篇

Helix

2篇

开源软件

18篇

架构

6篇

IOS

15篇

杂项

21篇

图形图像

4篇

Scrum

1篇

GPU

11篇

OpenGL

22篇

C++

8篇

OpenCV

7篇

备忘录

4篇

直播

9篇

VR

5篇

3D

3篇

Javascript

2篇

CDN技术

浏览器

7篇

OpenCL

3篇

播放器

2篇

AAC

5篇

MediaCodec

1篇

SQL

1篇

SQL数据库

1篇

Game Designing

1篇

机器学习

7篇

最新评论

Android studio 模拟器报错:E/EGL_emulation: tid 3073: eglSurfaceAttrib(1146): error 0x3009 (EGL_BAD_MATCH)

专注摸鱼的汪:

兄弟,解决了吗?是哪有问题?

hls流媒体:ts流格式介绍

怪我冷i:

引用「nalu header固定为0x00000001(帧开始)或0x000001(帧中)」

一个原始的H264 NALU单元通常由 **[StartCode] [NALU Header] [NALU Payload]** 三部分组成,其中StartCode用于标示这是一个NALU单元的开始,必须是 **"00 00 00 01"或"00 00 01"** ,除此之外基本相当于一个 **NAL header + RBSP** 。3字节的 **0x000001** 只有一种场合下使用,就是一个完整的帧被编为多个slice的时候,包含这些slice的NALU使用3字节起始码。其余场合都是4字节 **0x00000001** 的。

谷歌开源 3D 数据压缩算法 Draco以及代码分析

weixin_45438415:

但现在draco内部已经更新好多了,读起来好多都变了,有最新的讲解嘛

RTC与WebRTC有什么区别

luiio:

哈哈。良心

Android studio 模拟器报错:E/EGL_emulation: tid 3073: eglSurfaceAttrib(1146): error 0x3009 (EGL_BAD_MATCH)

不会贝斯的coco:

这个东西在哪里啊,点那个位置能找到,我一个小白直接看不明白

您愿意向朋友推荐“博客详情页”吗?

强烈不推荐

不推荐

一般般

推荐

强烈推荐

提交

最新文章

Ubuntu 20.04安装有道词典(成功版本)

Ubuntu 18.4 配置git

算力单位TOPS,GPU处理能力(TFLOPS/TOPS),CPU能力MIPS

2023年1篇

2022年1篇

2021年4篇

2020年15篇

2019年21篇

2018年29篇

2017年142篇

2016年81篇

2015年312篇

2013年1篇

2012年6篇

2011年27篇

2010年2篇

2009年5篇

2007年1篇

目录

目录

分类专栏

工具软件

6篇

QT

1篇

流媒体技术

10篇

解决方案

1篇

数据结构与算法

28篇

Multimedia

120篇

程序设计

33篇

Android

114篇

Linux

23篇

Windows

22篇

PM

4篇

FFmpeg

55篇

Python

18篇

Internet

4篇

Directshow

7篇

rtsp

2篇

Nginx

15篇

流媒体

70篇

服务器

36篇

HLS

20篇

HTML5

1篇

MPEGTS

4篇

WebRTC

4篇

面试

12篇

管理

8篇

网络编程

17篇

NAT

媒体格式

49篇

RTMP

9篇

HEVC

3篇

编解码

36篇

H265

6篇

H264

33篇

MPEG2TS

1篇

Helix

2篇

开源软件

18篇

架构

6篇

IOS

15篇

杂项

21篇

图形图像

4篇

Scrum

1篇

GPU

11篇

OpenGL

22篇

C++

8篇

OpenCV

7篇

备忘录

4篇

直播

9篇

VR

5篇

3D

3篇

Javascript

2篇

CDN技术

浏览器

7篇

OpenCL

3篇

播放器

2篇

AAC

5篇

MediaCodec

1篇

SQL

1篇

SQL数据库

1篇

Game Designing

1篇

机器学习

7篇

目录

评论 1

被折叠的  条评论

为什么被折叠?

到【灌水乐园】发言

查看更多评论

添加红包

祝福语

请填写红包祝福语或标题

红包数量

红包个数最小为10个

红包总金额

红包金额最低5元

余额支付

当前余额3.43元

前往充值 >

需支付:10.00元

取消

确定

下一步

知道了

成就一亿技术人!

领取后你会自动成为博主和红包主的粉丝

规则

hope_wisdom 发出的红包

实付元

使用余额支付

点击重新获取

扫码支付

钱包余额

0

抵扣说明:

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

余额充值

3D文件压缩库——Draco简析 - 刘世涛6192 - 博客园

3D文件压缩库——Draco简析 - 刘世涛6192 - 博客园

会员

周边

新闻

博问

AI培训

云市场

所有博客

当前博客

我的博客

我的园子

账号设置

简洁模式 ...

退出登录

注册

登录

刘世涛619247

博客园

  :: 

首页

  :: 

新随笔

  :: 

联系  :: 

订阅 

  :: 

管理

公告

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文件包含顶点信息和面的信息。 这两者的联系如图所示: 顶点信息就是该点的物体坐标、法线向量、纹理坐标等,如果绑定了骨骼,还有各块骨骼的权重。 面的信息指怎么由顶点围成面,它是一系列顶点索引的集合。如 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相关的资源大头(图片)还是一个老大难的问题。

版权声明:本文为博主原创文章,转载请注明出处:http://blog.csdn.net/jxt1234and2010 http://blog.csdn.net/jxt1234and2010/article/details/53999155

posted on

2018-03-16 13:41 

刘世涛6192 

阅读(2769) 

评论(1) 

编辑 

收藏 

举报

会员力量,点亮园子希望

刷新页面返回顶部

Powered by:

博客园

Copyright © 2024 刘世涛6192

Powered by .NET 8.0 on Kubernetes

Draco使用笔记(1)——图形解压缩-腾讯云开发者社区-腾讯云

o使用笔记(1)——图形解压缩-腾讯云开发者社区-腾讯云charlee44Draco使用笔记(1)——图形解压缩关注作者腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动文章/答案/技术大牛搜索搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网charlee44首页学习活动专区工具TVP最新优惠活动返回腾讯云官网社区首页 >专栏 >Draco使用笔记(1)——图形解压缩Draco使用笔记(1)——图形解压缩charlee44关注发布于 2022-05-19 12:51:314220发布于 2022-05-19 12:51:31举报文章被收录于专栏:代码编写世界代码编写世界目录1. 概述2. 详论2.1. 工具2.2. 代码1. 概述Draco是Google开发的图形压缩库,用于压缩和解压缩3D几何网格(geometric mesh)和点云(point cloud)。Draco还可以直接对obj或者ply格式的三维数据进行压缩和解压缩,甚至编译成wasm在浏览器端对glTF压缩和解压缩。2. 详论2.1. 工具Draco编译完成后直接提供了压缩和解压缩的工具draco_decoder.exe和draco_encoder.exe。通过命令行,我们对某个已经压缩好的文件进行解压缩:draco_decoder -i "D:/1.bin" -o "D:/1.ply"复制2.2. 代码如果需要用代码的方式实现,可以参考draco_decoder.exe中的源码,具体实现如下:#include

#include

#include

#include

using namespace draco;

using namespace std;

int main() {

string filePath = "D:/1.bin";

ifstream infile(filePath, ios::binary);

infile.seekg(0, std::ios::end);

size_t data_size = infile.tellg();

infile.seekg(0, std::ios::beg);

vector data(data_size, 0);

infile.read(data.data(), data_size);

DecoderBuffer buffer;

buffer.Init(data.data(), data_size);

//解压缩

std::unique_ptr pc;

auto type_statusor = draco::Decoder::GetEncodedGeometryType(&buffer);

if (!type_statusor.ok()) {

return 1;

}

//解析数据

const draco::EncodedGeometryType geom_type = type_statusor.value();

if (geom_type == draco::TRIANGULAR_MESH) {

draco::Decoder decoder;

auto statusor = decoder.DecodeMeshFromBuffer(&buffer);

if (!statusor.ok()) {

return 1;

}

std::unique_ptr mesh = std::move(statusor).value();

if (mesh) {

const int pos_att_id =

mesh->GetNamedAttributeId(GeometryAttribute::POSITION);

//解析顶点属性

for (PointIndex v(0); v < mesh->num_points(); ++v) {

const auto *const pos_att = mesh->attribute(pos_att_id);

const uint8_t *pos = pos_att->GetAddress(pos_att->mapped_index(v));

int64_t length = pos_att->byte_stride();

float temp[3];

memcpy(temp, pos, length);

printf("%f,%f,%f\t", temp[0], temp[1], temp[2]);

}

//解析顶点索引

for (FaceIndex f(0); f < mesh->num_faces(); ++f) {

printf("%d,%d,%d\t", mesh->face(f)[0].value(), mesh->face(f)[1].value(),

mesh->face(f)[2].value());

}

}

}

}复制需要注意的就是两点:传入draco::Decoder进行解压缩的需要二进制流,这个在从文件读取时一定要注意,很容易读成了文本流导致不能正常解压缩。对draco::Mesh的解析。draco::Mesh的顶点属性中的buffer并不是顶点索引中存储的数据。这个时压缩算法决定的,解析Mesh时一定要按照实例中解析。直接解析顶点属性中的buffer会得不到正确的顶点顺序。本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。 原始发表:2022-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除前往查看文件存储编程算法本文分享自 作者个人站点/博客 前往查看如有侵权,请联系 cloudcommunity@tencent.com 删除。本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!文件存储编程算法评论登录后参与评论0 条评论热度最新登录 后参与评论推荐阅读LV.关注文章0获赞0目录目录1. 概述2. 详论2.1. 工具2.2. 代码相关产品与服务文件存储文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。产品介绍产品文档2024新春采购节领券社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 |  京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档Copyright © 2013 - 2024 Tencent Cloud.All Rights Reserved. 腾讯云 版权所有登录 后参与评论00

Draco 3D Graphics Compression

Draco 3D Graphics Compression

Toggle navigation

Draco 3D

Github

Demo

Example

Spec

Draft Specification

Author README

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.

View on GitHub »

Take the Codelab

Learn about compressing and viewing 3D models with Draco, and about different compression models and their effects.

Codelab »

Draft Bitstream Spec

View and contribute to the in-progress Draco Bitstream Specification and Decoding Guide. (Also see the instructions for authors.)

Bitstream Spec »

Related Projects

NPM Package

WebVR

Khronos glTF

three.js

YouTube: Comparing Draco to gzip

YouTube: Draco Announced on Google Developer Show

© 2017 - 2024 The Draco authors

谷歌draco-腾讯云开发者社区-腾讯云

aco-腾讯云开发者社区-腾讯云点云PCL博主谷歌draco关注作者腾讯云开发者社区文档建议反馈控制台首页学习活动专区工具TVP最新优惠活动文章/答案/技术大牛搜索搜索关闭发布登录/注册首页学习活动专区工具TVP最新优惠活动返回腾讯云官网点云PCL博主首页学习活动专区工具TVP最新优惠活动返回腾讯云官网社区首页 >专栏 >谷歌draco谷歌draco点云PCL博主关注发布于 2019-07-31 11:46:011.6K0发布于 2019-07-31 11:46:01举报文章被收录于专栏:点云PCL点云PCL Draco 由谷歌 Chrome 媒体团队设计,旨在大幅加速 3D 数据的编码、传输和解码。因为研发团队的 Chrome 背景,这个开源算法的首要应用对象是浏览器。但既然谷歌把它开源,现在全世界的开发者可以去探索 Draco 在其他场景的应用,比如说非网页端。目前,谷歌提供了它的两个版本: JavaScript 和 C++。Draco 可以被用来压缩 mesh 和点云数据。它还支持压缩点( compressing points),连接信息,纹理协调,颜色信息,法线( normals)以及其他与几何相关的通用属性。下面是谷歌官方发布的 Draco Mesh 文件压缩率,可以看出,它大幅优于 ZIP。Draco 的算法既支持有损模式,也支持无损。这给普通消费者带来的好处还不太明显——毕竟大多数人对分辨率并没有强迫症,有损压缩带来的轻微画质改变完全在承受范 围之内。但对专业应用和科研应用的意义就很大了。这就好比 JPEG 之于 PNG。后者用于游戏和 VR 应用完全没有问题,降低的画质很难用肉眼察觉。但在科研点云数据中,任何信息都不能丢失。如何使用draco?github上简介:Draco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.(1)下载源码git clone https://github.com/google/draco.git (2) cd dracs mkdir build cmake .. 如果提示你cmake的版本太低了,则需要升级cmake ,命令如下 sudo add-apt-repository ppa:george-edison55/cmake-3.x sudo apt-get update 如果你从来没装过cmake 则sudo apt-get install cmake(经过测试 即使装过还是用这个命令直接升级比较好)

如果你装过cmake 则sudo apt-get upgrade安装完后,用命令:cmake --version 查看当前的cmake版本,可以看到现在cmake的版本为3.2.2之后就可以编译通过,make 一下傻等片刻就安装成功那么就可以使用查看一下效果,为了可视化以下,所以还是使用强大的PCL库来对比以下,在PCL库中读取PLY文件也是有对应的函数的class pcl::PCDReader()与class pcl::FLYReader() 分别是PCD,和FLY文件格式的接口的实现class pcl::PCDWriter()与class pcl::FLYWriter()分别是对PCD,FLY文件写入接口的实现查看发现它们的其他函数基本都是一样的,就是把PCD 换成FLY即可所以我们就可以使用draco来编码FLY格式的点云数据,然后在解码生成FLY文件,再在点云库中可视化一下,并且查看编码前后编码后文件的大小,可以看看编码的效率首先我们查看原始的文件以及它的大小3M 原始文件大小对原文件编码 生成了out.drc文件并查看文件大小113.KB的大小 编码命令 编码后的文件大小并可视化原始点云,如下图:然后为了在可视化编码后再解码的效果,所以再查看解压后的大小为431.5KB 解码命令 解码后的文件的大小可视化的效果和之前的是一样的,同时为了查看有没有丢失点数,打印出来看一下,发现点云数目没有变化都是35947 data points 总结以下,原来的文本是3M,编码后是113.KB文件,文件很小,压缩的效率非常高,为了再可视化,所以再解压,可视化的效果与原点云效果是一样的, 原始文件可视化并输出点云的大小 解码后的点云可视化并打印点云数目结合PCL库可视化的代码如下:#include //标准C++库中的输入输出的头文件

#include //PCD读写类相关的头文件

#include //PCL中支持的点类型的头文件

#include #include

#include

int main (int argc, char** argv)

{

//创建一个PointCloud boost共享指针并进行实例化

pcl::PointCloud::Ptr cloud (new pcl::PointCloud);

//打开点云文件

if (pcl::io::loadPLYFile ("bun_zipper.ply", *cloud) == -1)

{

PCL_ERROR ("Couldn't read file bun_zipper.ply \n"); return (-1);

}std::cout << "Loaded "

<< cloud->width * cloud->height << " data points from bun_zipper.ply with the following fields: "

<< std::endl;boost::shared_ptr viewer(new pcl::visualization::PCLVisualizer("cloud"));

viewer->addPointCloud(cloud,"cloud");while(!viewer->wasStopped())

{

viewer->spinOnce(100);

boost::this_thread::sleep(boost::posix_time::microseconds(1000000));

} return (0);

}复制对于draco的算法以及代码都没有详细的研究,这里只是看看它的压缩效率,同时我们在编码的时候,那几条命令时可以设置参数的,也可以设置编码的等级,所以还需要更加深入的研究,如有问题可以与我交流,谢谢本文参与 腾讯云自媒体分享计划,分享自微信公众号。原始发表:2019-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除打包bashbash 指令apt-gethttp本文分享自 点云PCL 微信公众号,前往查看如有侵权,请联系 cloudcommunity@tencent.com 删除。本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!打包bashbash 指令apt-gethttp评论登录后参与评论0 条评论热度最新登录 后参与评论推荐阅读LV.关注文章0获赞0领券社区专栏文章阅读清单互动问答技术沙龙技术视频团队主页腾讯云TI平台活动自媒体分享计划邀请作者入驻自荐上首页技术竞赛资源技术周刊社区标签开发者手册开发者实验室关于社区规范免责声明联系我们友情链接腾讯云开发者扫码关注腾讯云开发者领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL 数据库SSL 证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright © 2013 - 2024 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有 深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569腾讯云计算(北京)有限责任公司 京ICP证150476号 |  京ICP备11018762号 | 京公网安备号11010802020287问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档Copyright © 2013 - 2024 Tencent Cloud.All Rights Reserved. 腾讯云 版权所有登录 后参与评论00

版权声明:本文由比特派(bitpie)钱包app官方下载发布,如需转载请注明出处。

本文链接:https://www.siyuewuyu.com/article/89.html