2013-04-17 21 views
11

Próbuję zmienić obraz kostki w czasie wykonywania, wybierając opcję z elementu Wybierz formularz. Po uruchomieniu kodu obraz zmienia się po wybraniu, ale poprzednia kostka i zdjęcie pozostają w scenie.Aktualizacja tekstury/obrazu Three.js w środowisku wykonawczym

Jak prawidłowo czyścić/odświeżać/aktualizować scenę podczas zmiany materiału/obrazu/tekstury.

<div id = "container"></div> 

<form id = "changesForm"> 
    Cube Image: 
    <br> 
    <select id = "cubeImage"> 
     <option value = "random">Random</option> 
     <option value = "image1">First Image</option> 
     <option value = "Image2">Second Image</option> 
    </select> 
    <br> 
</form> 

<script type = "text/javascript"> 

window.onload = windowLoaded; 

function windowLoaded(){ 
    if (window.addEventListener){ 
     init(); 
     animate(); 
          //document.getElementById('container').addEventListener('mousemove', containerMouseover, false); 
    window.addEventListener('resize', onWindowResize, false); 
    var cubeImage = document.getElementById('cubeImage'); 
    cubeImage.addEventListener("change", changeCubeImage, false); 
    } 
    else if (window.attachEvent){ 
     //init(); 
     //animate(); 
        //document.getElementById('container').attachEvent('onmousemove', containerMouseover); 
     //window.attachEvent('onresize', onWindowResize); 
    } 

function changeCubeImage(e){ 
    //e.preventDefault(); 
    var target = e.target; 
    cubeImageCheck = target.value;  
    createCube();    
} 

// rest code ..... 

function createCube(){ 
    //image 
    var cubeImg; 

    switch (cubeImageCheck){ 
     case 'random': { 
      // should load the 2 images random - to do 
      cubeImg = new THREE.ImageUtils.loadTexture("img1.jpg"); 
      break; 
     } 
     case 'image1': { 
      cubeImg = new THREE.ImageUtils.loadTexture("image1.jpg"); 
      break; 
     } 
     case 'image2': { 
      cubeImg = new THREE.ImageUtils.loadTexture("image2.jpg"); 
      break; 
     } 
} 

cubeImg.needsUpdate = true; 


// geometry 
var cubeGeometry = new THREE.CubeGeometry(200,200,200);; 
// material 
var cubeMaterial = new THREE.MeshPhongMaterial({ 
    map: cubeImg, 
    side:THREE.DoubleSide, 
    transparent: true, 
    opacity:1, 
    shading: THREE.SmoothShading, 
    shininess: 90, 
    specular: 0xFFFFFF 
}); 

cubeMaterial.map.needsUpdate = true; 

//mesh 
cubeMesh = new THREE.Mesh(cubeGeometry, cubeMaterial); 
cubeMesh.needsUpdate = true; 
scene.add(cubeMesh); 
} 

// rest .... 

Odpowiedz

23

na wybranych zmian można zaktualizować istniejącą strukturę siatkową, nie trzeba usuwać lub tworzyć nowe oczek:

mesh.material.map = THREE.ImageUtils.loadTexture(src); 
mesh.material.needsUpdate = true; 
+0

działa świetnie. Dzięki banda Uhura. bardzo doceniony. –

+1

Ta metoda najwyraźniej pobiera obraz z pamięci podręcznej przeglądarki, jeśli wcześniej wstępnie załadowałeś wszystkie tekstury do niewidocznych elementów 'img'. Nie musisz więc martwić się o ponowne ładowanie obrazów z serwera. –

+4

Czy to nie spowoduje wycieku pamięci, ponieważ poprzednia tekstura nie została usunięta? – Kahless

Powiązane problemy