2015-05-10 10 views
6

, więc otrzymuję ten błąd i nie mogę znaleźć jego źródła. Uważam, że ma to związek ze sprowadzaniem i tworzeniem moich obiektów 3D na mojej scenie, ale nie jestem pewien, co robię źle.THREE.Object3D.add: obiekt nie jest instancją THREE.Object3D

oto kod: nazywam tę funkcję przed wywołuj 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); 
}); 
} 

Następnie w init dodawać obiekty na scenie

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

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

jest ładowarką zmienną globalną? – ProllyGeek

+0

Błędy otrzymuję: https://imgur.com/NWlmkcM – rikuto148

+0

nadal musisz odpowiedzieć na moje pytanie, więc mogę pomóc. – ProllyGeek

Odpowiedz

3

Ok tutaj jest problem, dodatek wywołanie jest wywoływane w niewłaściwym czasie, ponieważ nie napisałem tego kodu od zera i nie mam czasu na bardzo głębokie debugowanie, ale dam ci wskazówkę co jest nie tak i jestem pewien, że łatwo znajdziesz błąd później, bo myślę, że niektóre z twoich obiektów wciąż ładują się podczas próbujesz dodać je do sceny.

Procedura:

zmieniłem

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); 
    } 

pogrupowane działanie w jednej nowej funkcji o nazwie 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); 
    }; 

następnie w init() funkcji i wywołała addObjects();, ale nadal dają ten sam błąd !! Spróbowałem więc powołując go po jakimś czasie - w linii 309> index.html:

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

proszę zauważyć, że próbowałem 100ms, i to nie działał, a następnie 1 sekundy działa dobrze, to nie jest rozwiązanie, to jest just i wskazanie, że jeśli opóźnisz wywołanie funkcji, wszystko będzie działać poprawnie, teraz twoim zadaniem jest określić, kiedy je wywołać (tj. znaleźć odpowiednie zdarzenie, aby wywołać funkcję), ponieważ wygląda na to, że loader.onLoadComplete nie wykonuje tej pracy.

można znaleźć zmodyfikowany plik here.

+0

Dziękuję, mam nadzieję, że mogę wymyślić, kiedy zadzwonić do funkcji – rikuto148

+0

@ rikuto148 Myślę, że powinieneś użyć loadmanager, ponieważ możemy śledzić, co się naprawdę dzieje: http: // trojki.org/docs/# Reference/Loaders/LoadingManager – ProllyGeek

+0

Konfiguruję menedżera, ale nie drukuję wyników. Został popchnięty do github – rikuto148

Powiązane problemy