[英]Three.js - Load Collada file (and textures) from file inputs
目前,我有2个输入,一个输入几何(.dae)文件,一个输入纹理(.png / .jpg)。 我正在尝试使用来自文件输入的那些纹理加载Collada文件。 我有2个函数,它们在文件输入更改时被调用:
在调用完这两个函数之后,将调用第三个函数loadModel()。 此刻,我已经使其工作了一些; 模型最终被显示,但是纹理未正确应用,并且如果模型的上轴不是Y_UP,则显示的角度错误。 这是我为loadModel()编写的代码:
任何帮助将不胜感激; 我已经设法弄清楚了一段时间。 如果我不必从用户的计算机上加载Collada文件,那很好,但是我必须以某种方式使它从文件输入中起作用。 谢谢 :)
我最近从用户文件输入中对OBJ + MTL文件进行了相同类型的操作。
对three.js(r88) https://github.com/mrdoob/three.js/pull/11259的添加使您可以覆盖资源URL(将从文件上传中选择)。
我还看到了这个示例https://github.com/mrdoob/three.js/pull/12591 ,该示例用于帮助我解决加载OBJ + MTL文件的问题,并且只要它们使用loadingManager,它就适用于大多数模型加载器。 这也使得仅使用一个文件输入并同时选择模型/纹理成为可能(因此它也可以支持拖放)。
因此,我根据上述示例对collada格式做了一个小提琴: https ://jsfiddle.net/Lhrvna7a/45/
相关部分是:
$('.inputfile').change(function (e) {
var files = e.currentTarget.files;
var dae_path;
var extraFiles = {}, file;
for (var i = 0; i < files.length; i++) {
file = files[i];
extraFiles[file.name] = file;
//Filename ends in .dae/.DAE
if (files[i].name.match(/\w*.dae\b/i)) {
dae_path = files[i].name;
}
}
const manager = new THREE.LoadingManager();
manager.setURLModifier(function (url, path) {
url = url.split('/');
url = url[url.length - 1];
if (extraFiles[url] !== undefined) {
var blobURL = URL.createObjectURL(extraFiles[url]);
console.log(blobURL); //Blob location created from files selected from file input
return blobURL;
}
return url;
});
var loader = new THREE.ColladaLoader(manager);
loader.load(dae_path, function (collada) {
console.log(collada);
var dae = collada.scene;
scene.add(dae);
});
});
}
加载模型后,我假设您提到的其他操作(例如合并)可以与正常加载模型时相同的方式执行。
至于模型的角度/方向,模型可能已经在使用与three.js不同的坐标系的软件中创建。 我不确定是否可以事先在collada中了解模型的旋转(也许我错了),但是设置dae.rotation.set(0, 0, 0);
)可能就足够了dae.rotation.set(0, 0, 0);
在将模型添加到场景之前。
希望这对您有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.