无法将 ThreeJS 网格添加到范围之外的场景 - 三。Object3D.add:对象不是实例
Can't add ThreeJS mesh to scene outside of scope - THREE.Object3D.add: object not an instance
我刚刚开始将 ThreeJS 与 STLLoader、OrbitalControls 和 TransformControls 模块一起使用。
当我在 STLLoader 函数的范围内将网格添加到我的场景时,它按预期工作。但是,当尝试将其添加到范围之外时,它会抛出错误 THREE.Object3D.add: object not an instance.
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 );
STLLoader.load()
异步工作。即使你全局声明变量mesh
,在你的代码中执行scene.add( mesh );
时,它仍然是undefined
。因此,将 mesh
添加到 onLoad()
回调中的场景图是最稳健(也是最简单)的解决方案。
three.js R108
我刚刚开始将 ThreeJS 与 STLLoader、OrbitalControls 和 TransformControls 模块一起使用。
当我在 STLLoader 函数的范围内将网格添加到我的场景时,它按预期工作。但是,当尝试将其添加到范围之外时,它会抛出错误 THREE.Object3D.add: object not an instance.
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 );
STLLoader.load()
异步工作。即使你全局声明变量mesh
,在你的代码中执行scene.add( mesh );
时,它仍然是undefined
。因此,将 mesh
添加到 onLoad()
回调中的场景图是最稳健(也是最简单)的解决方案。
three.js R108