简体   繁体   English

Three.js OBJ MTL加载程序在IOS上不可见

[英]Three.js OBJ MTL Loader not visible on IOS

I'm using the obj+mtl loader to load my OBJ-files into my scene. 我正在使用obj + mtl加载程序将OBJ文件加载到场景中。 In my mtl file I'm loading my textures. 在我的mtl文件中,我正在加载纹理。

eg: 例如:

newmtl initialShadingGroup
illum 4
Kd 1.00 1.00 1.00
Ka 0.00 0.00 0.00
Tf 1.00 1.00 1.00
map_Kd 6922529901031.jpg
map_Bump 6922529901031_bump.jpg
Ni 1.00

Everything works fine on all systems, except for mobile IOS. 除了移动IOS之外,所有系统都可以正常运行。 On these devices the files which have a texture or get an environment map are not displaying at all. 在这些设备上,完全没有显示具有纹理或获得环境贴图的文件。 Just the shadows. 只是阴影。

What I tried so far: 到目前为止我尝试过的是:

  • Checking for textures to be a power of 2. 检查纹理为2的幂。

  • set the shading to double sided 将阴影设置为双面

  • controlling files sizes (everything below 200kb) 控制文件大小(所有小于200kb的文件)

When I use the web inspector i get this error: 当我使用网络检查器时,出现此错误:

[Error] THREE.WebGLProgram: shader error:  (7)
1282
"gl.VALIDATE_STATUS"
false
"gl.getProgramInfoLog"
""
""
""

Here is my loader: 这是我的装载机:

function loadMesh(objTxt, mtlTxt) {

var onProgress = function ( xhr ) {
    if ( xhr.lengthComputable ) {
    }
};
var onError = function ( xhr ) { };

var mtlLoader = new THREE.MTLLoader();
mtlLoader.setTexturePath('assets/');
mtlLoader.setPath( 'assets/' );
mtlLoader.load( mtlTxt, function( materials ) {

    materials.preload();
    if(materials.materials['initialShadingGroup']['map'] != null) {
        materials.materials['initialShadingGroup']['map']['magFilter'] = THREE.NearestFilter;
        materials.materials['initialShadingGroup']['map']['minFilter'] = THREE.LinearFilter;
    }

    /*set environment map*/
    materials.materials['initialShadingGroup']['envMap'] = new THREE.CubeTextureLoader().load( [ 'img/posx.jpg', 'img/negx.jpg', 'img/posy.jpg', 'img/negy.jpg', 'img/posz.jpg', 'img/negz.jpg' ] );
    /*set reflectivity of material*/
    materials.materials['initialShadingGroup']['reflectivity'] = 1.0;
    /*set anisotropy of bumpMap*/
    if(materials.materials['initialShadingGroup']['bumpMap'] != null) {
        materials.materials['initialShadingGroup']['bumpMap']['anisotropy'] = 16;
    }

    if(materials.materials['initialShadingGroup']['specularMap'] != null) {
        materials.materials['initialShadingGroup']['specularMap']['anisotropy'] = 16;
    }
    materials.materials['initialShadingGroup']['bumpScale'] = 0.1;

    var objLoader = new THREE.OBJLoader();
    objLoader.setMaterials( materials );
    objLoader.setPath( 'assets/' );
    objLoader.load( objTxt, function ( object ) {


        /*set attributes of OBJ childs*/
        object.traverse( function( node ) { if ( node instanceof THREE.Mesh ) { 

            node.castShadow = true; 
            node.receiveShadow = true; 

            node.material.shading = THREE.SmoothShading;
        } } );



        scene.add( object );



    }, onProgress, onError );

});
}

I finally figured it out myself. 我终于想通了。 For Anyone who is interested in my solution: I switched from OBJLoader to the more recent released OBJLoader2. 对于对我的解决方案感兴趣的任何人:我从OBJLoader切换到了最新发布的OBJLoader2。

var objLoader = new THREE.OBJLoader2();

I also got rid of the functionality to receive shadows: 我也摆脱了接收阴影的功能:

node.receiveShadow = false;

Finally my objects appear, and i can live with the fact, that no shadows will be received on Iphone and Ipad 终于我的物体出现了,我可以忍受这样的事实,在Iphone和Ipad上不会收到阴影

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM