所以我收到了这个错误,我无法找到它的来源。我相信它与我在场景中导入和创建我的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);
} );
}
然后在init中我将对象添加到场景
loader.onLoadComplete=function(){
scene.add(FloorDiskFire);
scene.add(firePillar);
scene.add(earthPillar);
scene.add(waterPillar);
scene.add(airPillar);
};
答案 0 :(得分:3)
好的,这是问题,在错误的时间调用add调用,因为我没有从头开始编写这段代码而没有时间进行非常深的调试,但我会给你一个错误的提示,并且我确定你会发现以后很容易找到这个bug,因为我认为当你试图将它们添加到场景时,你的一些物体仍在加载。
程序:
我改变了
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 。
答案 1 :(得分:0)
对于那些到达这里并寻找导致此错误的其他原因的人,我之所以得到它是因为我加载了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);
});