3D + MongoDB = 3D Repo

Post on 18-Jun-2015

635 views 7 download

Tags:

description

3D Repo (http://3drepo.org), winner of the MongoDB Innovation Award, is a non-linear version control system that enables coordinated management of large scale 3D models over the Internet. It is currently the only cloud-based architecture able to support maintenance and transmission of 3D models and associated metadata as well as rendering on the scale required by the industry. With MongoDB we can deliver significant improvements in the engineering workflow that supports collaborative design not possible otherwise. Instead of architects, engineers and constructors sharing massive files in a costly and time consuming manner, they can simply point their web browser to a shared online 3D repository. With our system, all stakeholders are able to examine their projects virtually, even on mobile devices. During the presentation, we will demonstrate the management of massive 3D models in a repository built directly atop of MongoDB. We will also demonstrate our online web-browser viewer capable of rendering 3D models directly from the DB without the need to install any plug-ins or firewall exceptions.

Transcript of 3D + MongoDB = 3D Repo

3D + MongoDB = 3D RepoJozef Doboš

UK construction industry worth ~£72bn

“If you do what

you’ve always done,

you’ll always get

what you’ve always gotten”- Tony Robbins

Government mandate aims to save 20% cost...

… via a common data environment

Why ?

Because it’s polymorphic,

scalable

and binary

Engineering Creative Industries Manufacturing

App level version control

Plain vanilla1) Scene graph of components

2) Non-linear revision history

3) Streamable 3D geometry

Schemaless schema?

Each component is a logical unit

Properties are key-value pairs

BSON is limited to 16MB

Mesh

Mesh

1 {

2 _id : BinData(3,"1OXvtFihRm6aH+nh+cioGw==" ), // Unique UUID

3 api : 1, // API level

4 bounding_box : [[-1.0, -1.0, -1.0], // Min xyz

5 [ 1.0, 1.0, 1.0]] // Max xyz

6 faces : BinData(0,"AwAAAAAAAAABAAAAAgAAAAAAA... " ), // Faces array

7 faces_byte_cout : 192,

8 faces_count : 12,

9 normals : BinData(0,"AAAAAAAAgL8AAAAAAAAAAAA... " ), // Normals array

10 outline : [[-1, -1], [1, -1], [1, 1], [-1, 1]],

11 paths : [[BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" )]], // Paths from root

12 shared_id : BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" ), // Shared UUID

13 type : "mesh",

14 name : "cube",

15 vertices : BinData(0,"AACAPwAAgL8AAIC/AACAPw... " ), // Vertices array

16 vertices_byte_count : 288,

17 vertices_count : 36,

18 }

Mesh

1 {

2 _id : BinData(3,"1OXvtFihRm6aH+nh+cioGw==" ), // Unique UUID

3 api : 1, // API level

4 bounding_box : [[-1.0, -1.0, -1.0], // Min xyz

5 [ 1.0, 1.0, 1.0]] // Max xyz

6 faces : BinData(0,"AwAAAAAAAAABAAAAAgAAAAAAA... " ), // Faces array

7 faces_byte_cout : 192,

8 faces_count : 12,

9 normals : BinData(0,"AAAAAAAAgL8AAAAAAAAAAAA... " ), // Normals array

10 outline : [[-1, -1], [1, -1], [1, 1], [-1, 1]],

11 paths : [[BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" )]], // Paths from root

12 shared_id : BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" ), // Shared UUID

13 type : "mesh",

14 name : "cube",

15 vertices : BinData(0,"AACAPwAAgL8AAIC/AACAPw... " ), // Vertices array

16 vertices_byte_count : 288,

17 vertices_count : 36,

18 }

Vertices

1 [

2 [ 1.0,1.0,1.0], [ 1.0,1.0,-1.0], [ 1.0,-1.0,1.0], [ 1.0,-1.0,-1.0],

3 [-1.0,1.0,1.0], [-1.0,1.0,-1.0], [-1.0,-1.0,1.0], [-1.0,-1.0,-1.0]

4 ]

1 {

2 0 :

3 {

4 0 : 1.0,

5 1 : 1.0,

6 2 : 1.0,

7 },

8 1 :

9 {

10 0 : 1.0,

11 1 : 1.0,

...

Vertices

Massive overhead

1 [

2 [ 1.0,1.0,1.0], [ 1.0,1.0,-1.0], [ 1.0,-1.0,1.0], [ 1.0,-1.0,-1.0],

3 [-1.0,1.0,1.0], [-1.0,1.0,-1.0], [-1.0,-1.0,1.0], [-1.0,-1.0,-1.0]

4 ]

1 {

2 0 :

3 {

4 0 : 1.0,

5 1 : 1.0,

6 2 : 1.0,

7 },

8 1 :

9 {

10 0 : 1.0,

11 1 : 1.0,

...

Material

Material

1 {

2 _id : BinData(3,"YUHQ09687daqQ+nh+cioGw==" ), // Unique UUID

3 ambient : [0, 0, 0],

4 api : 1, // API level

5 diffuse : [0.28, 0.12, 0.06],

6 name : "Material",

7 opacity : 1,

8 paths : [[BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" )]], // Paths from root

9 shared_id : BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" ), // Shared UUID

10 shininess : 384.313,

11 specular : [ 0.98, 0.98, 0.98],

12 two_sided : true,

13 type : "material",

14 wireframe : true,

15 }

Texture

Texture

1 {

2 _id : BinData(3,"HWQOIJDDF775GQnh+cioGw==" ), // Unique UUID

3 api : 1, // API level

4 data : [[BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" )]], // Texture bytes

5 data_byte_cout : 190622,

6 height : 894,

7 mime : "image/jpeg",

8 name : "crate diffuse",

9 paths : [[BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" )]], // Paths from root

10 shared_id : BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" ), // Shared UUID

11 type : "texture",

12 width : 894,

13 }

Unique _id (UID) vs shared_id (SID)

Unique _id (UID) vs shared_id (SID)

Revision

1 {

2 _id : BinData(3,"YUHQ09687daqQ+nh+cioGw==" ), // Unique UUID

3 added : [[BinData(3,"1OXvtFihRm6aH+nh+cioGw==" )], ...],

4 api : 1, // API level

5 author : "jozef",

6 current : [[BinData(3,"1OXvtFihRm6aH+nh+cioGw==" )], ...],

7 name : "master",

8 message : "My very first commit.",

8 paths : [[BinData(3,"MAU5l5mEVIlCQAAAAAAACA==" )]], // Paths from root

10 shared_id : BinData(3,"AAAAAAAAAAAAAAAAAAAAAA" ), // Shared UUID

11 timestamp : ISODate("2014-11-06T10:02:09Z" ),

12 type : "revision",

13 }

Clie

nt

Serv

er

Clie

nt

Serv

er

Clie

nt

Serv

er

Clie

nt

Serv

er

Clie

nt

Serv

er

Clie

nt

Serv

er

What about the security?

Public/private keys

User roles at the application level

What about the future?

Streaming of geometry from cache

repo.cache.chunksrepo.cache.files

Scene graph as a BSON wrapper

Contact us

3D Repo Ltd℅ EIT ICT LabsCentre House Block C56 Wood LaneLondon W12 7SBUnited Kingdom

Company registered in England No. 9014101

Email: support@3drepo.orgWebsite: http://3drepo.orgYoutube: http://youtu.be/YIo96mYelio