0
//var 3 obj models, cushion, backrest and frame , and var chair01 as a group for including 3 obj
            var cushion;
            var backrest;
            var frame;

            var chair01 = new THREE.Object3D();
            var loader = new THREE.OBJLoader( manager );

//load obj model with function
            loadObj("chair/obj/cushion.obj", cushion, materialCushion);
            loadObj("chair/obj/backrest.obj", backrest, materialBackrest);
            loadObj("chair/obj/frame.obj", frame, materialFrame);

            function loadObj(path, name, material) {
                loader.load('model-stuff/' + path, function( object ) {
                        object.traverse( function ( child ){
                            if ( child instanceof THREE.Mesh ) {
                                var uvs = child.geometry.attributes.uv.array;
                                child.geometry.addAttribute( 'uv2', new THREE.BufferAttribute( uvs, 2 ) );
                                child.material = material;
                                child.receiveShadow = true;
                                child.castShadow = true;
                            }
                        });
                    name = object;
                    name.position.y = -10;
                    chair01.add( name );
                }, onProgress, onError);
            }

//add chair01 into scene
            scene.add(chair01);

//remove frame from chair01
            manager.onLoad = function() {
                chair01.remove(frame);
            }

Code above, i loaded obj with a loadObj function, but why i cannot remove the "frame" from chair01?

i have tried another method,if i didn't load obj via loadObj funtion, i can remove frame from chair01

1 Answers1

1

The car "frame" is sent as a parameter to loadObj, but presumably undefined still. And frame is never defined after that. Edit: this is due to scope closure on the parameter. You need a object to maintain persistence.

//var 3 obj models, cushion, backrest and frame , and var chair01 as a group for including 3 obj
        var parts = {
        cushion:"cushion",
        backrest:"bracket",
        frame:"frame";
        }


        var chair01 = new THREE.Object3D();
        var loader = new THREE.OBJLoader( manager );

//load obj model with function
        loadObj("chair/obj/cushion.obj", parts.cushion, materialCushion);
        loadObj("chair/obj/backrest.obj", parts.backrest, materialBackrest);
        loadObj("chair/obj/frame.obj", parts.frame, materialFrame);

        function loadObj(path, name, material) {
            loader.load('model-stuff/' + path, function( object ) {
                    object.traverse( function ( child ){
                        if ( child instanceof THREE.Mesh ) {
                            var uvs = child.geometry.attributes.uv.array;
                            child.geometry.addAttribute( 'uv2', new THREE.BufferAttribute( uvs, 2 ) );
                            child.material = material;
                            child.receiveShadow = true;
                            child.castShadow = true;
                        }
                    });
                parts[name] = object;
                parts[name].position.y = -10;
                chair01.add( parts[name]);
                //parts[name] = object;
            }, onProgress, onError);
        }

//add chair01 into scene
        scene.add(chair01);

//remove frame from chair01
        manager.onLoad = function() {
            chair01.remove(parts.frame);
        }
Radio
  • 2,810
  • 1
  • 21
  • 43
  • thanks, follow the clue you provided, i tested the codes and did some adjustments. The edited version works, although i still do not understand the reason very much~~~~~~~~~ – Huating Xie Sep 02 '16 at 05:57
  • hi Radio, may i write like `var cushion = "cushion"; var backrest = "backrest"; var frame = "frame";` without the "parts" object? – Huating Xie Sep 02 '16 at 12:47
  • I think you're missing a fundamental aspect of JavaScript programming. I would study closures and how javascript cleans up memory. You could start here: http://stackoverflow.com/questions/111102/how-do-javascript-closures-work – Radio Sep 02 '16 at 14:11