0

我正在研究three.js,并且正在尝试导入一个带有相应mtl 文件的.obj 文件。mtl 文件引用的纹理是 .bmp,所以我调整了 mtl 文件以指向所有 .dds 文件并将我的所有资产转换为 dds。问题是它只是渲染白色纹理。我不确定它是否相关,但它说不支持 PVRTC 压缩纹理。这是我用于 obj/mtl 加载器的代码:

var onProgress = function(xhr) {
  if (xhr.lengthComputable) {
    var percentComplete = xhr.loaded / xhr.total * 100;
    console.log(Math.round(percentComplete, 2) + '% downloaded');
  }
};
var onError = function(xhr) {};
THREE.Loader.Handlers.add(/\.dds$/i, new THREE.DDSLoader());
var loader = new THREE.OBJMTLLoader();
loader.load('assets/FirstPersonExampleMap.obj', 'assets/FirstPersonExampleMap.mtl', function(object) {
  object.position.y = 0;
  scene.add(object);
}, onProgress, onError);

这是我调整的 .mtl 文件的示例:

newmtl assets/M_WhiteEditQuarter_M_WhiteEditQuarter
	map_Kd M_WhiteEditQuarter_M_WhiteEditQuarter_D.dds
	map_Ks M_WhiteEditQuarter_M_WhiteEditQuarter_S.dds
	bump M_WhiteEditQuarter_M_WhiteEditQuarter_N.dds

4

1 回答 1

1

.mtl 目录中对纹理的引用应该与 html 文件所在的位置有关。所以 .mtl 应该是这样的:

newmtl M_WhiteEditQuarter_M_WhiteEditQuarter
    map_Kd assets/M_WhiteEditQuarter_M_WhiteEditQuarter_D.dds
    map_Ks assets/M_WhiteEditQuarter_M_WhiteEditQuarter_S.dds
    bump assets/M_WhiteEditQuarter_M_WhiteEditQuarter_N.dds

thenewmtl只是一个名称,因此它不必以 . 为前缀assets。其余的是纹理的实际路径。

更新 1

一般评论:您的模型很大。那是一回事。另一个是您使用了很多 1x1 纹理。为什么?他们造成了很多延误。第三个问题是你的纹理也很大。对于您的漫反射纹理可以吗?但是您的法线贴图没有这样的细节来保证它们占用的空间。

回到问题

查看您的 bmp 版本;您的 .obj 和 .mtl 文件需要修复。正如我所说newmtl的只是一个名称,所以它不必是路径前缀。但是您的 .obj 和 .mtl 文件之间存在不一致。在一个文件newmtl中以路径为前缀,而在另一个文件中则没有。因此,当 .obj 加载时,它永远不会找到材料。因此,一旦我修复了纹理,就会出现。

同样在一种情况下,mtl 定义FirstPersonExampleMap_FirstPersonExampleMap_PersistentLevel_SkySphereBlueprint_Sky Sphere mesh_MaterialInstanceDynamic_3中有空格。我不确定这是否有效。

我用来查看更改的工具是http://www.finalmesh.com/

注意:看起来你的世界周围有一个很大的球体,而且你的教堂周围也有一些元素实际上是白色的。我不得不放大很多,直到我有材料可以展示。

http://imgur.com/JtQcT2u

http://imgur.com/UwfD0Rb

于 2015-06-05T21:47:25.217 回答