Introducing Draco: compression for 3D graphics

Introducing Draco: compression for 3D graphics
Friday, January 13, 2017
3D graphics are a fundamental part of many applications, including gaming, design and data visualization. As graphics processors and creation tools continue to improve, larger and more complex 3D models will become commonplace and help fuel new applications in immersive virtual reality (VR) and augmented reality (AR). Because of this increased model complexity, storage and bandwidth requirements are forced to keep pace with the explosion of 3D data.
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.
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.

Sample Draco compression ratios and encode/decode performance*
Transmitting 3D graphics for web-based applications is significantly faster using Draco’s JavaScript decoder, which can be tied to a 3D web viewer. The following video shows how efficient transmitting and decoding 3D objects in the browser can be - even over poor network connections.

Video and audio compression have shaped the internet over the past 10 years with streaming video and music on demand. With the emergence of VR and AR, on the web and on mobile (and the increasing proliferation of sensors like LIDAR) we will soon be swimming in a sea of geometric data. Compression technologies, like Draco, will play a critical role in ensuring these experiences are fast and accessible to anyone with an internet connection. More exciting developments are in store for Draco, including support for creating multiple levels of detail from a single model to further improve the speed of loading meshes.
We look forward to seeing what people do with Draco now that it’s open source. Check out the code on GitHub and let us know what you think. Also available is a JavaScript decoder with examples on how to incorporate Draco into the three.js 3D viewer.

Source : Introducing Draco: compression for 3D graphics | Google Open Source Blog

By Jamieson Brettle and Frank Galligan, Chrome Media Team

  • Specifications: Tests ran with textures and positions quantized at 14-bit precision, normal vectors at 7-bit precision. Ran on a single-core of a 2013 MacBook Pro. JavaScript decoded using Chrome 54 on Mac OS X.
1 Like

The Rhino 7 WIP that was released today now contains support for draco compression in RhinoCommon.

2 Likes

hi @stevebaer - this is fantastic news for .NET Framework projects.
Will this be making it’s way into the Rhino3dm library for .NET Core projects such as mine?
Is the source code available for your implementation to allow me to recreate a c# workaround method in NET Core until it does?

All of the source for rhino3dm is available at

I do plan on adding draco support to the .NET version of Rhino3dm; it is mostly a matter of the complexity of getting the draco libraries to properly compile into the Rhino3dm.NET native DLL portion.

Hi @stevebaer

So for now in my Javascript I cannot do:

const mesh = rhino.DracoCompression.decompressBase64String(data)

because my meshes are created earlier in a NET Core process that lacks draco .
So how do I re-instantiate them on the javascript side from their jsons?
I was hoping that they would simple parse automatically like:

var mesh = JSON.Parse(myMeshJson);

but this doesn’t seem to succeed. I also saw that you added a RhinoCommon.Geometry.Mesh.FromJson() /
.FromBase64() method which would do the trick but unless I am mistaken these methods are not in the rhino3dm.js library.

Can you advise?

There is a static decode function on the CommonObject class in rhino3dm.js that should decode your json data into a Mesh instance.

1 Like

I had been working on a large project for a friend, when I found that 7zip, at it highest non-block settings compressed Rhino source files down to about 25%.

@Brenda - thanks for that info. I am guessing you are zipping a 3dm file.
We are working directly with the Mesh/Brep classes rather than the 3dm file and these classes have a .ToJSON() method that base64 encodes the bulk of the data. --I don’t know whether in our use case zipping a JSON that already is base64 compressed would yield any significant gains.