如何更改加载到three.js的Blender模型中的纹理;是否已加载ImageUtils.loadTexture?

如何更改加载到three.js的Blender模型中的纹理;是否已加载ImageUtils.loadTexture?,three.js,textures,blender,Three.js,Textures,Blender,我正在做一个学生项目,其中涉及一个礼品盒,用户可以改变它的外观 我开始学习如何制作立方体,导入纹理并设置gui.dat控件以允许用户更改纹理 我现在正试图用一个礼品盒的搅拌机模型来替换立方体,但是我在改变纹理时遇到了问题 编辑:完整代码在github上,请点击此处: 工作多维数据集模型的编码为: `//添加带有纹理的立方体 var cubeGeometry = new THREE.CubeGeometry(4,4,4); var cubeMaterial = new THREE

我正在做一个学生项目,其中涉及一个礼品盒,用户可以改变它的外观

我开始学习如何制作立方体,导入纹理并设置gui.dat控件以允许用户更改纹理

我现在正试图用一个礼品盒的搅拌机模型来替换立方体,但是我在改变纹理时遇到了问题

编辑:完整代码在github上,请点击此处:

工作多维数据集模型的编码为:

`//添加带有纹理的立方体

    var cubeGeometry = new THREE.CubeGeometry(4,4,4);
    var cubeMaterial = new THREE.MeshLambertMaterial({ map:
             THREE.ImageUtils.loadTexture("birthday.jpg") });
    var cube = new THREE.Mesh(cubeGeometry,cubeMaterial);

    cube.position.set (0,0,0);
    cube.rotation.set (0,-1.2,0);
    cube.receiveShadow  = true;

    // add the cube to scene
    scene.add(cube); `
//gui纹理变化

`var controls = new function()
{ this.changeTexture = "birthday";

this.changeTexture = function (e){
var texture = THREE.ImageUtils.loadTexture
("../assets/textures/general/" + e + ".jpg");
cube.material.map = texture; }`
//gui控件

var gui = new dat.GUI();
gui.add(controls, "changeTexture", ['christmas', 'valentine', 'birthday']).onChange(controls.changeTexture);
我把礼物盒分为四个部分,我只是想让第一部分,盒子,改变纹理。我加载了以下内容:

var box;
    var loaderOne = new THREE.JSONLoader();

    loaderOne.load('../assets/models/box.js', function (geometry)
    {
        var material = new THREE.MeshLambertMaterial({color: 0xffff00});
        box = new THREE.Mesh(geometry, material);
        box.position.set (5,0,5);
        box.scale.set (1,1,1);
        //box.name = "mybox";
        scene.add(box);
    });
我无法使用gui控件更改纹理。我尝试在gui纹理更改代码中将“立方体”更改为“长方体”,并尝试命名长方体并调用它(在上面的代码中注释掉),但这些都不起作用。我在很多地方都在寻找答案,但我真的被卡住了。我觉得我可能错过了一些明显的东西


如果有任何帮助,我们将不胜感激。

由于我导入的模型没有纹理贴图,因此代码无法正常工作

我所做的是回到Blender并创建一个模型,其中包含两个纹理,每个纹理都可以应用于整个模型。导出的JSON文件具有模型几何体和两个纹理(以及它们的纹理贴图)

在three.js中,我加载了它:

// load in geometry and textures
    var loader = new THREE.JSONLoader();
    loader.load('../models/two textures on cube.js', function (geometry, material)
    {
        matOne = new THREE.MeshLambertMaterial(material[1]);
        matTwo = new THREE.MeshLambertMaterial(material[2]);
        box = new THREE.Mesh(geometry, matOne);

        //position, scale
        box.position.set (0,0,0);
        box.rotation.set (0,-1.2,0);
        box.scale.set (2,2,2);
        box.receiveShadow  = true;
        scene.add(box);


    }, '../models');
然后使用以下代码切换纹理:

//gui control panel
    var controls = new function()
    {                   
        //changing the texture
        this.changeTexture = function (e)
        {
        switch (e) 
            {
        case "birthday":
        box.material = matOne;
        break;

        case "christmas":
        box.material = matTwo;
        break;
            }
        }
    }
此代码用于gui.dat控件:

//gui control panel
    var gui = new dat.GUI();
    gui.add(controls, "changeTexture", ['birthday', 'christmas']).onChange(controls.changeTexture);

设置
material.map=texture后,是否设置了
texture.needsUpdate=true
?不幸的是,这不起作用。它适用于没有那一行的立方体,但当我尝试更改长方体纹理时,无论有没有那一行,它都不起作用。你需要显示整个代码,而不是片段。你能提供一个活生生的例子吗?我会去清理我的文件夹和代码,然后在github中发布,然后链接到这里。我现在已经有点晚了,所以明天早上我要做这件事,否则我会犯困的错误。感谢您花时间查看我的代码。我已经编辑了原始问题,并在github上添加了完整代码的链接。如果第122行的单词“box”更改为“cube”,则可以通过gui正确更改立方体纹理。更改长方体当前不起作用。