Not all materials are visible on both sides

Hello

I have a problem with visibility some materials in my mesh. Of course I have enabled DoubleSide ( node.material.side = THREE.DoubleSide; ) but there is still problem as shown in the picture below:

I have checked node.material.name where is shown name of material and there isn`t all materials:

But in front of mesh are shown all materials correctly.

Loaders OBJ+MTL:

 var mtlLoader = new THREE.MTLLoader();
            mtlLoader.setPath( 'obj/700/' );

            mtlLoader.load( '700.mtl', function( materials ) {
                materials.preload();
                var objLoader = new THREE.OBJLoader();
                objLoader.setMaterials( materials );
                objLoader.setPath( 'obj/700/' );
                objLoader.load( '700.obj', function ( object ) {

                    object.traverse(function(node) {
                        if(node.material) {

                        node.material.side = THREE.DoubleSide;
                        //node.material.shading = THREE.FlatShading;
                        console.log(node.material.name);
                        
                        if(node.material.name == 'tubes') {
                            node.material.shading = THREE.FlatShading;
                            node.material.shininess = 20;
                            node.material.reflectivity = 0.5;

                            node.material.specular = new THREE.Color(0xffffff);
                        }
                    }
                     });   
                        
                

                    //object.receiveShadow = true;
                    scene.add( object );

                }, onProgress, onError );
            });

OK I solved this problem.
I have noticed that some materials are kept in additional array. Rest materials were kept directly in objects as instance of MeshPhongMaterial so just only were visible both sides.
So I created additional loop for arrays to change side options for all materials inside these array for THREE.DoubleSide.

Added the loop for array of objects in the last condition:

object.traverse(function(node) {

                        if(node.material !== undefined) {
                            node.material.side = THREE.DoubleSide;
                            console.log(node.material);
                        
                        if(node.material.name == 'tubes') {
                            node.material.shading = THREE.FlatShading;
                            node.material.shininess = 20;
                            node.material.reflectivity = 0.5;

                            node.material.specular = new THREE.Color(0xffffff);
                        }
                        else if(node.material instanceof Array)
                        {
                            
                            var arrayLen = node.material.length;
                            for(var i=0; i<arrayLen; i++) {
                                node.material[i].side = THREE.DoubleSide;
                            }
                        }
                    }

                     });
1 Like