【问题标题】:THREE.Object3D.add: object not an instance of THREE.Object3DTHREE.Object3D.add:对象不是 THREE.Object3D 的实例
【发布时间】:2019-05-01 13:08:42
【问题描述】:

所以我收到了这个错误,我找不到它的来源。我相信这与我在场景中导入和创建 3d 对象有关,但我不确定我做错了什么。

代码如下: 我在调用 init 之前调用了这个函数

function loadObjects()
{
loader = new THREE.JSONLoader();

var floorDiskmaterial = new THREE.MeshPhongMaterial({
    map: THREE.ImageUtils.loadTexture('img/floor_test.jpg'),
    transparent: true,
    color: 0xeaeaea,
    ambient: 0xeaeaea,
    overdraw: 0.5,
    //specular: 0x6a3e6d,
    shading: THREE.FlatShading,
    fog: false,
    //shininess: 50,
});

loader.load( "models/floorScene.js", function( geometry ) {
    FloorDiskFire = new THREE.Mesh( geometry, floorDiskmaterial);
    FloorDiskFire.position.set(0,0.2,0);
    FloorDiskFire.castShadow = true;
    FloorDiskFire.receiveShadow = true;
    FloorDiskFire.scale.set(1.5,1.5,1.5);
    //FloorDiskFire.rotation.y = -0.78;
} );

//-----Pillar Loader------//

var pillarMaterial = new THREE.MeshPhongMaterial({
    //map: THREE.ImageUtils.loadTexture('img/pillarMap.png'),
    //transparent: true,
    color: 0xeaeaea,
    ambient: 0xeaeaea,
    overdraw: 0.5,
    //specular: 0x6a3e6d,
    shading: THREE.FlatShading,
    fog: false,
    //shininess: 50,
});

loader.load( "models/pillar.js", function( pillar ) {
    firePillar = new THREE.Mesh(pillar, pillarMaterial);
    firePillar.position.set(135,0,135);
    firePillar.castShadow = true;
    firePillar.receiveShadow = true;
    firePillar.scale.set(1.7,1.7,1.7);
} );

loader.load( "models/pillar.js", function( pillar ) {
    earthPillar = new THREE.Mesh(pillar, pillarMaterial);
    earthPillar.position.set(135,0,-135);
    earthPillar.castShadow = true;
    earthPillar.receiveShadow = true;
    earthPillar.scale.set(1.7,1.7,1.7);
} );

loader.load( "models/pillar.js", function( pillar ) {
    airPillar = new THREE.Mesh(pillar, pillarMaterial);
    airPillar.position.set(-135,0,135);
    airPillar.castShadow = true;
    airPillar.receiveShadow = true;
    airPillar.scale.set(1.7,1.7,1.7);
} );

loader.load( "models/pillar.js", function( pillar ) {
    waterPillar = new THREE.Mesh(pillar, pillarMaterial);
    waterPillar.position.set(-135,0,-135);
    waterPillar.castShadow = true;
    waterPillar.receiveShadow = true;
    waterPillar.scale.set(1.7,1.7,1.7);
} );
}

然后在初始化中我将对象添加到场景中

loader.onLoadComplete=function(){
    scene.add(FloorDiskFire);

    scene.add(firePillar);
    scene.add(earthPillar);
    scene.add(waterPillar);
    scene.add(airPillar);
};

【问题讨论】:

标签: javascript three.js


【解决方案1】:

对于那些到达这里并寻找得到此错误的替代原因的人,我得到它是因为我加载了一个 GLTF 对象,但没有将它作为 THREE.Object3D 对象添加到场景中。

我做错了什么的简化示例:

let example = new THREE.Object3D();
loader.load(objects.exampleGLTF, function (object){
    example = object;
    scene.add(example);
});

我疑惑了一阵子,做了各种调试才发现,确实是在加载,等了5秒也没让问题消失。

关键是添加“.scene”,如下所示。

let example = new THREE.Object3D();
loader.load(objects.exampleGLTF, function (object){
    example = object.scene;
    scene.add(example);
});

【讨论】:

  • 我太笨了。这只是因为我使用的是object 而不是object.scene 在你的情况下......
【解决方案2】:

好的,问题就在这里,add调用是在错误的时间调用的,因为我没有从头开始编写这段代码,也没有时间进行非常深入的调试,但我会告诉你什么是错误的,我确定稍后您会发现很容易找到错误,因为我认为您的一些对象在您尝试将它们添加到场景时仍在加载。

程序:

我变了

loader.onLoadComplete=function(){
        scene.add(FloorDiskFire);
        //scene.add(FloorDiskEarth);
        //scene.add(FloorDiskWater);
        //scene.add(FloorDiskAir);

        scene.add(firePillar);
        scene.add(earthPillar);
        scene.add(waterPillar);
        scene.add(airPillar);
    }

将操作分组到一个名为 addObjects(); 的新函数中:

function addObjects(){
        scene.add(FloorDiskFire);
        //scene.add(FloorDiskEarth);
        //scene.add(FloorDiskWater);
        //scene.add(FloorDiskAir);

        scene.add(firePillar);
        scene.add(earthPillar);
        scene.add(waterPillar);
        scene.add(airPillar);
    };

然后在你的 init() 函数中我调用了 addObjects(); ,但它仍然给出同样的错误!!所以我尝试在一段时间后调用它 - 在第 309 行 > index.html :

setTimeout(function(){addObjects();},1000);

请注意,我尝试了 100 毫秒,但它没有用,然后 1 秒效果很好,这不是解决方案,它只是表明如果你延迟函数调用一切都会正常工作,这是你现在的工作确定何时调用它(即找到调用函数的适当事件),因为 loader.onLoadComplete 似乎没有做这项工作。

你可以找到修改后的文件here

【讨论】:

  • 谢谢,希望我能弄清楚何时调用该函数
  • @rikuto148 我想你应该使用 loadingmanager ,因为我们可以追踪真正发生的事情:threejs.org/docs/#Reference/Loaders/LoadingManager
  • 我设置了管理器,但它没有打印出结果。推送到github
  • @GvSharma 是的,你到底想做什么?
  • 我是三个 js 的新手,正在学习它,我需要开始渲染 3d 模型,并且可以在网站中使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多