2015-05-10 2 views
6

in modo che ottenga questo errore e non riesco a trovare la fonte di esso. Credo che abbia a che fare con me importando e creando i miei oggetti 3d nella mia scena, ma non sono sicuro di cosa sto facendo male.THREE.Object3D.add: oggetto non un'istanza di THREE.Object3D

ecco il codice: io chiamo questa funzione prima che chiami 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); 
}); 
} 

Poi nel init aggiungo gli oggetti sulla scena

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

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

carica una variabile globale? – ProllyGeek

+0

Gli errori im ottenendo: https://imgur.com/NWlmkcM – rikuto148

+0

devi ancora rispondere alla mia domanda in modo da poterti aiutare. – ProllyGeek

risposta

3

approvazione qui è il problema, il componente aggiuntivo la chiamata viene invocata nel momento sbagliato, perché non ho scritto questo codice da zero e non ho tempo per il debugging molto profondo, ma ti darò un suggerimento su cosa è sbagliato, e sono sicuro che troverai più facile trovare il bug più tardi, perché penso che alcuni dei tuoi oggetti stiano ancora caricando mentre stai cercando di aggiungerli alla scena.

Procedura:

ho cambiato

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

raggruppato l'azione in una nuova funzione chiamata 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); 
    }; 

poi nella vostra init() funzione ho invocato il addObjects();, ma ancora dare lo stesso errore !! Così ho provato invocandolo dopo qualche tempo - in linea 309> index.html:

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

prega di notare che ho provato 100ms, e non ha funzionato, poi 1 secondo funziona bene, questa non è una soluzione, è solo e indicando che se si ritarda la chiamata della funzione tutto funzionerà bene, è ora il vostro compito determinare quando chiamarlo (cioè trovare l'evento corretto per richiamare la funzione) in quanto sembra che loader.onLoadComplete non stia facendo il lavoro.

è possibile trovare il file modificato here.

+0

Grazie, spero di poter capire quando chiamare la funzione – rikuto148

+0

@ rikuto148 suppongo che dovresti usare loadingmanager, dato che possiamo tenere traccia di ciò che sta realmente accadendo: http: // threejs.org/docs/# Reference/Loaders/LoadingManager – ProllyGeek

+0

Ho configurato il manager ma non sta stampando i risultati. È spinto a github – rikuto148