在Three.js中加载托管在Google云端存储上的obj和mtl文件

时间:2017-03-14 22:00:18

标签: three.js google-cloud-storage

我正在构建一个用于处理3D数据的Web应用程序,并希望呈现属于每个用户的3D数据。 3D文件(.obj,.mtl,png等)存储在GCS中,用户应该只能访问自己的3D文件。

我现在正在尝试使用three.js渲染3d文件,但是在我的生命中找不到使用OBJLoader和MTLLoader加载文件的好方法。如果我将文件作为静态内容从我的服务器提供,它可以正常加载和渲染,但我找不到加载存储在GCS中的非公共文件的方法。

我正在使用此代码加载静态文件

const mtlFile = "test.mtl";
const objFIle = "test.obj";
var mtlLoader = new THREE.MTLLoader();
mtlLoader.load(mtlFile, function( materials ) {
    materials.preload();
    var objLoader = new THREE.OBJLoader();
    objLoader.setMaterials( materials );
    ObjLoader.load( objFile, function ( object ) {
        object.position.z = 40;
        scene.add( object );
    }, onProgress, onError );
});

问题是我的mtl文件通常如下所示:

newmtl default
Ka 1.00 1.00 1.00
Kd 1.00 1.00 1.00
Ks 0.00 0.00 0.00
Ns 20.00
illum 2

newmtl test
Ka 1.00 1.00 1.00
Kd 1.00 1.00 1.00
Ks 0.00 0.00 0.00
Ns 20.00
illum 2
map_Ka test.png
map_Kd test.png

即。它指向一个名为test.png的文件。可以设置基本路径,因此如果我可以使用可在此处使用的网址http://example.com/test.png来提供文件。

但是,我希望文件只能由创建它们的用户访问。如果我在GCS中托管了test.png,我可以获得一个看起来像这样的签名链接:

https://storage.googleapis.com/test-bucket/test.png?GoogleAccessId=blajlakdsjflasjdflkj&Expires=14954&Signature=V92B0 ........

我无法找到与OBJ / MTL装载机配合良好的方法

那么,有关如何解决此问题的任何提示?我是否需要构建某种文件代理来提供仅与用户连接的文件?

顺便说一下。我正在托管自己的用户数据库和身份验证,因此与用户的Google帐户无关。

1 个答案:

答案 0 :(得分:0)

为了获得理想的安全性,代理可能最适合您的需求。它不必实际代理所有数据。也许three.js可以很好地处理重定向?您可以将重定向发布到已签名的URL。

但是,这取决于您如何为这些对象的隐私建模。如果你只是给所有这些对象提供了实际上无法猜测的冗长的随机名称,那么只要没有坏方可以学习对象名称,你就会解决你的安全问题。这将很快解决您的问题,而无需构建精心设计的额外服务。

当然,安全建模很复杂。您是否关心撤销访问权限?您是否需要能够限制用户访问对象的时间长度?用户是否应该能够共享对象的访问权限?对于您的案例,我不知道这些问题的答案。但是,通过HTTPS匿名访问的长名称可能足以满足其中许多人的需求。