为什么JSONLoader不会立即将子项添加到场景中?

时间:2012-07-02 12:31:50

标签: three.js

链接到网页:http://door-in-wall.asg-3d.ru

来源:http://door-in-wall.asg-3d.ru/source.zip

调用 init()后,初始化场景:添加了相机,灯光,生成的几何体(文本和球体),并加载了 JSonLoader 3D模型。 相机,灯光和生成的几何体立即被添加到场景中,但是当 JSonLoader 加载模型时 - 我无法理解...

  // Create 3D Text Mesh
  var textMesh3 = new THREE.Mesh( text3d3, textMaterial );
  textMesh3.position.x = textMesh1.position.x;
  textMesh3.position.y = textMesh2.position.y - text3d1.boundingBox.max.y * 2.6;

  scene.add( textMesh3 );

  console.log('textMesh3 within init() = ', textMesh3); //textMesh3 = THREE.Mesh
  console.log('scene.children.length after load textMesh3 = ', scene.children.length); //scene.children.length = 6


  // Add back plane
  var loader = new THREE.JSONLoader().load( "js/backplane.js", function ( geometry ) {

    geometry.computeBoundingBox();

    backPlaneMesh = new THREE.Mesh( geometry, backPlaneMeshMaterial );
    backPlaneMesh.position.set(SCREEN_WIDTH, 0, 0);
    backPlaneMesh.scale.set(4, 4, 4);

    scene.add(backPlaneMesh);

  });

  console.log('JSONLoader within init() = ', loader); //loader = undefined 
  console.log('scene.children.length after load JSONLoader = ', scene.children.length); //scene.children.length = 6

我将控制台输出留给了场景 console.log(scene.children.length)的后代:第103,148,167行。

如果您在调用 animate() render()之后检查 scene.children.length ,那么它将显示7个孩子的存在。

如何以及何时使用JSONLoader加载模型?

1 个答案:

答案 0 :(得分:1)

loader.load()是异步的。换句话说,它不会在完成之前停止代码执行。它将并行加载,并在完成后执行回调。根据模型的大小,下载和解析可能需要几秒钟。即使你在本地加载它也需要几毫秒。