2015-12-19 3 views
2

Я не могу загрузить несколько объектов с помощью collada, и несколько ответов здесь, в переполнении стека, не работают для меня. Я сделал с tr.js экспорт, но с collada не работают. Вот мой код. Если кто-то знает, как будет спасателем жизни. Благодаря!Three.js Collada - Загрузка нескольких объектов Collada в Three js

function o(){ 
    var loader = new THREE.ColladaLoader(); 
    scene = new THREE.Scene(); 
    loader.options.convertUpAxis = true; 
    loader.load('nn.dae', function (collada){ 
     dae = collada.scene; 
     dae.scale.x = dae.scale.y = dae.scale.z = 3; 
     //dae.updateMatrix(); 
     scene.add(dae); 
     //console.log(scene); 
    }); 
    loader.load('erer.dae', function (collada){ 
     dae1 = collada.scene; 
     dae1.scale.x = dae1.scale.y = dae1.scale.z = 3; 
     //dae1.updateMatrix(); 
     //scene.add(dae1); 
     //console.log(scene); 
    }); 

    init(); 
    animate(); 

} 
o(); 
function init(){ 
    /*creates empty scene object and renderer*/ 
    camera = new THREE.PerspectiveCamera(45, 600/400, .1, 500); 
    renderer = new THREE.WebGLRenderer({antialias:true}); 

    renderer.setClearColor(0x000000); 
    renderer.setSize(600, 400); 
    renderer.shadowMapEnabled= true; 
    renderer.shadowMapSoft = true; 

    /*add controls*/ 

    camera.position.x = 5; 
    camera.position.y = 9; 
    camera.position.z = 42; 
    camera.lookAt(scene.position); 

    /*datGUI controls object*/ 
    guiControls = new function(){ 
     this.rotationX = 0.0; 
     this.rotationY = 0.0; 
     this.rotationZ = 0.0; 

     this.lightX = 19; 
     this.lightY = 47; 
     this.lightZ = 19; 
     this.intensity = 2.5;  
     this.distance = 373; 
     this.angle = 1.6; 
     this.exponent = 38; 
     this.shadowCameraNear = 34; 
     this.shadowCameraFar = 2635; 
     this.shadowCameraFov = 68; 
     this.shadowCameraVisible=false; 
     this.shadowMapWidth=512; 
     this.shadowMapHeight=512; 
     this.shadowBias=0.00; 
     this.shadowDarkness=0.11;  

    } 
    /*adds spot light with starting parameters*/ 
    spotLight = new THREE.SpotLight(0xffffff); 
    spotLight.castShadow = true; 
    spotLight.position.set (20, 35, 40); 
    spotLight.intensity = guiControls.intensity;   
    spotLight.distance = guiControls.distance; 
    spotLight.angle = guiControls.angle; 
    spotLight.exponent = guiControls.exponent; 
    spotLight.shadowCameraNear = guiControls.shadowCameraNear; 
    spotLight.shadowCameraFar = guiControls.shadowCameraFar; 
    spotLight.shadowCameraFov = guiControls.shadowCameraFov; 
    spotLight.shadowCameraVisible = guiControls.shadowCameraVisible; 
    spotLight.shadowBias = guiControls.shadowBias; 
    spotLight.shadowDarkness = guiControls.shadowDarkness; 
    scene.add(spotLight); 

    /*adds controls to scene*/ 

      $("#webGL-container").append(renderer.domElement); 
    /*stats*/ 

} 


function render() {  

    spotLight.position.x = guiControls.lightX; 
    spotLight.position.y = guiControls.lightY; 
    spotLight.position.z = guiControls.lightZ; 

} 

EDIT: Что я хочу сделать, так это манипулировать шкалой объектов на входных значениях пользователей в форме. Я нашел эту технику, где я загружаю один файл colada с двумя объектами blender с разными именами, а с помощью кода ниже я могу изменить масштаб Cube, но масштаб Cube.001 не изменится. Также, если я даю такое имя, как «dsds», файл colada даже не загружается. Вот код

loader.options.convertUpAxis = true; 
loader.load('vaddsi.dae', function (collada){ 
    dae = collada.scene; 
    dae.scale.x = dae.scale.y = dae.scale.z = 3; 
    dae.traverse(function (child){ 
     if (child.colladaId == "Cube.001"){ 
      child.traverse(function(e){ 
       e.castShadow = true; 
       e.receiveShadow = true; 
       e.scale.x=0.4; 
       if (e.material instanceof THREE.Mesh){ 
        //e.material.needsUpdate = true; 
       }     
      }); 
     } 
     if (child.colladaId == "Cube"){ 
      child.traverse(function(e){ 
       e.scale.x=2; 
       if (e.material instanceof THREE.Mesh){ 
        e.material.needsUpdate = true; 
       } 
      }); 
     } 
    }); 
    dae.updateMatrix(); 
    init(); 
    animate(); 
    console.log(scene); 
}); 
+0

возможно 'renderer.render (камера, сцены)' в '' оказывать) функцию (? – gaitat

+0

Nop .. Я получаю эту ошибку: Uncaught TypeError: Не удается прочитать свойство 'x' неопределенного –

+0

где (на какой строке)? – gaitat

ответ

1
function o(){ 
var loader = new THREE.ColladaLoader(), 
    loader2 = new THREE.ColladaLoader(), 
    dae, dae1; 
scene = new THREE.Scene(); 
loader.options.convertUpAxis = true; 
loader.load('nn.dae', function (collada){ 
    dae = collada.scene; 
    dae.scale.x = dae.scale.y = dae.scale.z = 3; 
    //dae.updateMatrix(); 
    scene.add(dae); 
    //console.log(scene); 
}); 
loader2.load('erer.dae', function (collada){ 
    dae1 = collada.scene; 
    dae1.scale.x = dae1.scale.y = dae1.scale.z = 3; 
    //dae1.updateMatrix(); 
    scene.add(dae1); 
    //console.log(scene); 
}); 

init(); 
animate(); 

} 

Не для получения поставить requestAnimationFrame() в визуализатора, где обновляется кулачок и сцена.

если вы не можете получить множество масштаба используйте эту настройку:

function o(){ 
var loader = new THREE.ColladaLoader(), 
    loader2 = new THREE.ColladaLoader(), 
    dae, dae1; 
scene = new THREE.Scene(); 
loader.options.convertUpAxis = true; 
loader.load('nn.dae', function (collada){ 
    var StartTime = new Date(); 
    dae = collada.scene; 
    scene.add(dae); 
}, function(xhr){ 
    if(xhr.loaded >= xhr.total){ 
    var EndTime = new Date(), TotalTime; 
    EndTime = StartTime - EndTime; 
    TotalTime = Math.abs(EndTime); 
    console.log("Object 1 loaded\nLoaded in: " + TotalTime + "ms."); 
    setTimeout(function(){ 
     dae.scale.x = 3; 
     dae.scale.y = 3; 
     dae.scale.z = 3; 
     console.log("Object 2 adjusted scales"); 
    }, TotalTime); 
    } 
}); 
loader2.load('erer.dae', function (collada){ 
    var StartTime = new Date(); 
    dae1 = collada.scene; 
    scene.add(dae1); 
}, function(xhr){ 
    if(xhr.loaded >= xhr.total){ 
    var EndTime = new Date(), TotalTime; 
    EndTime = StartTime - EndTime; 
    TotalTime = Math.abs(EndTime); 

    console.log("Object 2 loaded\nLoaded in: " + TotalTime + "ms."); 
    setTimeout(function(){ 
     dae1.scale.x = 3; 
     dae1.scale.y = 3; 
     dae1.scale.z = 3; 
     console.log("Object 2 adjusted scales"); 
    }, TotalTime); 
    } 
}); 

init(); 
animate(); 

} 
Смежные вопросы