无法将ThreeJS网格添加到范围之外的场景-THREE.Object3D.add:对象不是实例

时间:2019-09-10 14:01:57

标签: javascript three.js orbital-mechanics

我刚刚开始将ThreeJS与STLLoader,OrbitalControls和TransformControls模块一起使用。

当我在STLLoader函数范围内将网格添加到场景中时,它会按预期工作。但是,当尝试将其添加到范围之外时,它会引发错误 THREE.Object3D.add:对象不是实例

mesh变量是全局声明的,因此我无法在加载程序范围之外使用它。不知道我在做什么错,但会有所帮助!

var renderer, scene, camera, mesh, orbit, control;

                // mesh
                var loader = new THREE.STLLoader();

                loader.load( 'benchy.stl', function ( geometry ) {

                    var material = new THREE.MeshPhongMaterial( { color: 0x4eacc2, specular: 0x111111, shininess: 200 } );

                    mesh = new THREE.Mesh( geometry, material );
                    mesh.position.set( 0, 0, 0);
                    mesh.rotation.set( - Math.PI / 2, 0, 0 );
                    mesh.scale.set( 2, 2, 2 );

                    //scene.add( mesh );
                });

                //controls
                orbit = new THREE.OrbitControls( camera, renderer.domElement );
                orbit.update();
                orbit.addEventListener( 'change', render );

                control = new THREE.TransformControls( camera, renderer.domElement );
                control.addEventListener( 'change', render );
                control.addEventListener( 'dragging-changed', function ( event ) {
                    orbit.enabled = ! event.value;
                } );

                scene.add( mesh );
                control.attach( mesh );
                scene.add( control );

1 个答案:

答案 0 :(得分:2)

STLLoader.load()异步工作。即使您全局声明变量mesh,当在代码中执行undefined时,它仍然是scene.add( mesh );。因此,在mesh回调中将onLoad()添加到场景图是最可靠(也是最简单)的解决方案。

three.js R108