是否可以 access/downlad 来自 Decentraland 的 glb 或 gltf 模型?

Is it possible to access/downlad glb or gltf models from Decentraland?

我使用 dcl initdcl start 创建了一个虚拟场景,并从他们的 github repositories 之一导入了一些模型。

我创建了一个创建场景的小脚本,将这些模型导入场景,控制台记录我导入场景的模型列表:

...

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)
            }
        }
    })
)

...

该脚本让我可以访问一些模型元数据,即项目中的模式路径及其在场景中的变换矩阵:

我想知道是否可以 access/download 3D 模型。

是否可以访问这些 3D 模型,也许 GET?有人知道 Decentraland 是否禁止这种做法吗?据我所知,他们正在使用 Unity 引擎。

只是在场景中的一个模型上做 GET 似乎并不成功:

这有可能实现吗?

编辑:

在@cachius 的回答后,按照他的建议,我找到了以下内容:

unity.data(#1) 文件是一个 UnityWebData1.0 文件,可以使用 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'])

提取的数据文件夹包含一个或多个 .unity3d 文件,可以使用 AssetStudio 进一步解压缩,但是这个工具对我来说看起来有点 buggy/unstable,不确定它的可靠性如何。

根据我的发现,它包含大部分场景辅助实体,但模型。模型以gltf格式(#2)单独下载。可以只下载文件并使用 Blender 导入它。

因此 gltf 模型似乎位于 http://127.0.0.1:8001/content/contents/ 并且文件已重命名。我还无法检索关于 http://127.0.0.1:8001/content/contents 确切内容的元数据,所以我会继续挖掘。

访问

查看模型是否在“网络”选项卡中显示为请求。如果是这样,您可以右键单击并 'Copy as curl' 通过添加 > model.glb 在命令行中下载它们。这样您就可以应用与客户端相同的 headers 和参数。

合法性

他们提供的内容与用户提供的内容之间似乎存在重要区别。他们 Terms 的相关部分,为清楚起见编辑了法律术语:

1。接受条款

Decentraland 基金会拥有 DCL 客户端、桌面客户端、SDK 5.0、市场、构建器、命令行界面、DAO 和开发人员中心的权利,在本文中称为“工具”。

12。所有权

12.1 工具的所有权利归基金会所有。除非在第 13 条中获得授权,否则您同意不复制、修改、分发、执行、展示或创建基于工具的衍生作品。视觉界面、图形(包括所有相关的艺术和绘图)以及工具的代码和数据,不包括用户提交的内容,均归基金会所有。 ... 您同意,除这些条款中明确包含的内容外,对 LAND 的任何“购买”均不授予您对与其中的工具和内容相关的艺术和绘图的权利。未经基金会书面同意,您无权复制基金会材料。

13。开源许可证。

13.1 授予版权许可。

每位投稿人均授予您复制、准备衍生作品、public展示、public表演、再许可和分发作品以及源代码中的衍生作品或此类衍生作品的版权许可Object表格。

13.3 重新分配。

您可以在任何媒体中复制和分发副本或衍生作品,无论是否修改,以源代码或 Object 形式,只要您满足以下条件:

  1. 修改不得违反隐私和内容政策,也不得违反或违反第 12.3 节,并要求任何其他贡献者遵守这些限制;
  2. 任何修改只能在向公众发布后六 (6) 个月后进行 public;
  3. 您必须向任何其他接收者提供本许可的副本;
  4. 您必须使任何修改过的文件带有显着的通知,说明您更改了文件;
  5. 您必须在任何衍生作品中保留来源的所有版权、专利、商标和归属声明
  6. 如果作品包含“通知”文本文件,则任何衍生作品都必须在其中包含归属通知的副本。 ...

您应该直接在 Discord Twitter Reddit Telegram or GitHub 上联系他们或他们的社区,并在此处添加结果。