'Is it possible to access/downlad glb or gltf models from Decentraland?
I have created a dummy scene using dcl init
& dcl start
and imported a few models from one of their github repositories.
I created a small script which creates a scene, imports those models into the scene and console logs the list of models I imported into the scene:
...
const trashCan = addToScene("trashCan", "models/Trash_Can.glb", new Transform({
position: new Vector3(0.2, 0.2, 0.2),
rotation: new Quaternion(0, 0, 0, 1),
scale: new Vector3(1, 1, 1)
}));
trashCan.addComponent(
new OnPointerDown((): void => {
console.log("Downloadable entities:");
// console.log(engine.entities);
for (let k in engine.entities) {
// console.log(engine.entities[k])
// console.log(engine.entities[k].components)
const shape = engine.entities[k].components["engine.shape"]
const transform = engine.entities[k].components["engine.transform"]
if (shape) {
// console.log(engine.entities[k].components["engine.shape"].data)
console.log(" name: " + shape.src)
}
if (transform) {
console.log(" position: " + transform.position)
}
}
})
)
...
The script gives me access to some model metadata i.e. modes' path in the project and their transform matrices in the scene:
I was wondering whether it is possible to access/download the 3D models.
Could it be possible to have access to those 3D models, maybe GET
them? Does anybody know if Decentraland prohibits such practices? AFAIK they're using the Unity engine.
Just doing a GET
on one of the models in the scene doesn't seem to be successful:
Could this be possible to achieve?
EDIT:
After the answer from @cachius, following his suggestion, I was able to find the following:
unity.data
(#1) file is a UnityWebData1.0
file which can be decompressed using UnityPack as described here:
from unitypack.utils import BinaryReader
SIGNATURE = 'UnityWebData1.0'
class DataFile:
def load(self, file):
buf = BinaryReader(file, endian="<")
self.path = file.name
self.signature = buf.read_string()
header_length = buf.read_int()
if self.signature != SIGNATURE:
raise NotImplementedError('Invalid signature {}'.format(repr(self.signature)))
self.blobs = []
while buf.tell() < header_length:
offset = buf.read_int()
size = buf.read_int()
namez = buf.read_int()
name = buf.read_string(namez)
self.blobs.append({ 'name': name, 'offset': offset, 'size': size })
if buf.tell() > header_length:
raise NotImplementedError('Read past header length, invalid header')
for blob in self.blobs:
buf.seek(blob['offset'])
blob['data'] = buf.read(blob['size'])
if len(blob['data']) < blob['size']:
raise NotImplementedError('Invalid size or offset, reading past file')
import os
f = open('unity.data', 'rb')
df = DataFile()
df.load(f)
EXTRACTION_DIR = 'extracted'
for blob in df.blobs:
print('extracting @ {}:\t{} ({})'.format(blob['offset'], blob['name'], blob['size']))
dest = os.path.join(EXTRACTION_DIR, blob['name'])
os.makedirs(os.path.dirname(dest), exist_ok=True)
with open(dest, 'wb') as f:
f.write(blob['data'])
The extracted data folder contains one or more .unity3d files which can be further unpacked using AssetStudio, however the tool looked a bit buggy/unstable to me, not sure how reliable it is.
From what I've discovered this contains much of the scene helper entities, but not the models. The models are downloaded separately in gltf
format(#2). One can just download the file and import it using Blender.
So it seems that the gltf models are located in http://127.0.0.1:8001/content/contents/
and the files are renamed. I was unable to retrieve the metadata regarding the exact contents of http://127.0.0.1:8001/content/contents
yet, so I'll keep digging.
Solution 1:[1]
Access
Have a look if the models appear as requests in the Network tab. If so you can right click and 'Copy as curl' to download them in the command line by adding > model.glb
. This way you apply the same headers and parameters as the client.
Legality
There seems to be an important distinction between content provided by them vs content provided by users. Relevant sections from their Terms, legalese edited for clarity:
1. Acceptance of Terms
The Decentraland Foundation holds the rights over the DCL Client, the Desktop Client, the SDK 5.0, the Marketplace, the Builder, the Command Line Interface, DAO, and the Developers’ Hub which are referred to herein as the "Tools".
12. Proprietary Rights
12.1 All rights of the Tools are owned by the Foundation. Except as authorized in Section 13, you agree not to copy, modify, distribute, perform, display or create derivations based on the Tools. The visual interfaces, graphics including all art and drawings associated with and the the code and data of the Tools, excluding the Content submitted by Users, are owned by the Foundation. ... You agree that any "purchase" of LAND does not give you rights to the art and drawings associated with the Tools and content therein other than those expressly contained in these Terms. And that you do not have the right to reproduce the Foundation Materials without the Foundation’s written consent.
13. Open Source License.
13.1 Grant of Copyright License.
Each Contributor grants to you a copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
13.3 Redistribution.
You may reproduce and distribute copies or derivations in any medium, with or without modifications, and in Source or Object form, provided that you meet the following conditions:
- modifications shall not infringe the Privacy and Content Policies, nor allow their infringement or of Section 12.3 and require any further Contributor to abide by these limitations;
- any modifications can only take place until six (6) months have elapsed since the release to the general public;
- you must give any other recipients a copy of this License;
- you must cause any modified files to carry prominent notices stating that you changed the files;
- you must retain in any derivations all copyright, patent, trademark, and attribution notices from the Source
- if the Work includes a "NOTICE" text file, then any derivation must include a copy of the attribution notices in it. ...
You should reach out to them or their community directly on Discord Twitter Reddit Telegram or GitHub and add results here.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | cachius |