image - Three.js 纹理/图像在运行时更新

标签 image three.js textures

我试图在运行时通过从 Select Form 元素中选择一个选项来更改立方体图像。运行代码时,选择后图像发生变化,但之前的立方体和图像保留在场景中。

更改 Material /图像/纹理时如何正确清除/刷新/更新场景。

<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 ....

最佳答案

在选择更改时,您可以更新现有网格纹理,无需删除或创建新网格:

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

关于image - Three.js 纹理/图像在运行时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16066448/

相关文章:

java - 显示相同的纹理。绑定(bind)问题?

android - 将互联网图像指定为按钮背景?

javascript - IE 6、7、8 不支持图像对象或 DOM 中的 onload 事件

python - 裁剪功能 Jython JES

THREE.js 没有阴影

javascript - 将存储 RGBA 的 Uint8Array 数组保存到 .png 文件

c - 如何使用 GLUT 在按键上的纹理/帧缓冲区之间切换?

java - 使用 Java 将地理位置坐标渲染为图像

javascript - 通过实例化,我无法更改各个子几何图形的透明度/不透明度

java - 键输入上的 Libgdx 纹理太快