如何使用JavaScript / FileApi / XHR加载从blender导出的* .babylon?

时间:2015-08-30 19:04:28

标签: javascript 3d babylonjs

我很高兴使用 .babylon 文件格式。 为Blender 3D编辑器开发的导出器工作正常,如果使用下一个代码加载导出的模型:

// won't write the full code
// because it was fetched from the playground and it's very standard and works
BABYLON.SceneLoader.Load("", "fileName.babylon", engine, function (newScene) {
...

运行良好,浏览器中的WebGL渲染器显示我的模型。

但是,如果我不想将模型加载为必须保存在HTTP-server (IIS,Apache,lighttpd,nginx等等)的公共文件夹中的静态文件,该怎么办?

例如我想从用户那边加载 .babylon 文件,或者确保在我的后端访问 .babylon 文件。

好吧,如果我在我的网络应用程序中提供某种上传器(使用浏览器中的File API),我们就可以观察到这种情况,用户可以从中加载3D模型他们的电脑或其他设备。

我正在尝试像这样加载模型:

文件上传(change输入文件事件)效果很好:

    function handleFiles( event ) {
        var uploader = event.srcElement || event.currentTarget;
        var files = uploader.files;

        var reader = new FileReader();
        reader.onload = function( event ) {
            var data = JSON.parse( event.target.result );
            loadCustomMesh( data );
        };

        // passing only single mesh because of testing purpose
        reader.readAsText( files[ 0 ] );
    }

处理几何体并添加到场景中:

function loadCustomMesh( data ) {
    var mesh = new BABYLON.Mesh( Math.random().toString(), scene );
    mesh.setVerticesData( BABYLON.VertexBuffer.PositionKind, data.meshes[ 0 ].positions, true );
    mesh.setVerticesData( BABYLON.VertexBuffer.NormalKind, data.meshes[ 0 ].normals, true );
    mesh.setIndices( data.meshes[ 0 ].indices );

    mesh.position = new BABYLON.Vector3( 0, 0, 0 );
    ...

效果很好!但!!!没有材料......

我发现多材料来自上传的数据:

enter image description here

但是如果要使用下一个代码:

mesh.material = data.multiMaterials[ 0 ];

这对此示例完全有效,它会抛出下一个错误:

Uncaught TypeError: t.needAlphaBlending is not a function

我甚至不知道接下来该做什么,有什么想法吗?

1 个答案:

答案 0 :(得分:0)

问题在这里解决了:

http://www.html5gamedevs.com/topic/16846-how-to-load-babylon-exported-from-blender-using-javascriptfileapixhr/

function handleFiles( event ) {
    var uploader = event.srcElement || event.currentTarget;
    var files = uploader.files;
    var reader = new FileReader();

    reader.onload = function( event ) {
        var result = event.target.result;

        BABYLON.SceneLoader.ImportMesh(
            null,
            event.target.result,
            '',
            scene,
            function( newMeshes, particleSystems, skeletons ) {
                var mesh = newMeshes[ 0 ];
                mesh.position = new BABYLON.Vector3( 0, 0, 0 );
            }
        );
    };

    reader.readAsDataURL( files[ 0 ] );
}