Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Model 了解如何使用';访问加载到three.js中的模型;全局变量';以聚光灯为例_Model_Three.js_Loader - Fatal编程技术网

Model 了解如何使用';访问加载到three.js中的模型;全局变量';以聚光灯为例

Model 了解如何使用';访问加载到three.js中的模型;全局变量';以聚光灯为例,model,three.js,loader,Model,Three.js,Loader,我试图理解three.js如何访问加载的模型。这是我正在努力理解的一个例子: 我加载了一个模型,一个带有纹理和聚光灯的简单混合立方体。我在加载器前声明“盒子”: var box; // load in geometry and textures var loader = new THREE.JSONLoader(); loader.load('../models/two textures on cube 03.js', function (geometry, materi

我试图理解three.js如何访问加载的模型。这是我正在努力理解的一个例子:

我加载了一个模型,一个带有纹理和聚光灯的简单混合立方体。我在加载器前声明“盒子”:

var box;
    // load in geometry and textures
    var loader = new THREE.JSONLoader();
    loader.load('../models/two textures on cube 03.js', function (geometry, material)
    {
        box = new THREE.Mesh(geometry, material[2]);
        //position, scale
        box.position.set (0,0,0);
        box.rotation.set (0,-1.2,0);
        box.scale.set (2,2,2);
        box.receiveShadow  = true;
        scene.add(box);

        // add spotlight for the shadows
        var spotLight = new THREE.SpotLight( 0xffffff );
        spotLight.position.set( -10, 14, 14 );
        spotLight.target = box;
        spotLight.castShadow = true;
        scene.add( spotLight );         

    }, '../models');
这很有效。但是,如果我将聚光灯编码移到加载程序括号之外(之后),聚光灯将不起作用,即使我在括号之外声明了“box”

我知道如果以这种方式将聚光灯添加到渲染函数中:

if (box) {
            //all spotlight coding added in here, exactly as used above
        }
这样就行了。但我不知道为什么

我还知道,如果我不直接将长方体添加到场景中,而是将长方体放置在加载程序之前声明的Object3D中,那么我可以在加载程序之后添加聚光灯,并将聚光灯对准Object3D,这样就可以了

为什么聚光灯“看到”加载程序之前声明的Object3D,但没有看到“var-box”?如果我在render函数中使用if语句,为什么它能“看到”框?这是否与完成加载程序功能所需的时间有关


感谢您的帮助。

模型的加载是异步的,因此您不确定在调用执行后是否真的加载了模型。所以你应该做的是:

var loader = new THREE.JSONLoader();
loader.onLoadComplete = function () {

    // here you know that the model has loaded

    scene.add (box);

}
loader.load ...
聚光灯代码应完全独立,且不与加载代码混合。
您可以在

中找到有关
加载程序.onLoad*
方法的更多信息。模型的加载是异步的,因此您不确定在调用执行后是否真的加载了模型。@gaitat那么访问模型以操纵它的唯一方法是将其放入Object3D中?您也可以在将其添加到场景之前添加一个名称,然后执行
var object=scene.getObjectByName(“您提供的名称”,true)),而不是使用某种类型的编码,即“当加载模型时”@gaitat谢谢你,我以前试过给它命名,但没有用,但我在编码中没有“true”。那很有用,谢谢。