RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 975892
Accepted
corocoto
corocoto
Asked:2020-04-28 21:30:14 +0000 UTC2020-04-28 21:30:14 +0000 UTC 2020-04-28 21:30:14 +0000 UTC

Three.js 改变纹理

  • 772

如何使用 3d 对象更改当前纹理(以编程方式设置)textureObjLoader?

textureObjLoader = new THREE.TextureLoader(),
        map = textureObjLoader.load(`./models/${allTextures[i][0]}`);
        material = new THREE.MeshPhongMaterial({map: map});
        objLoader = new THREE.OBJLoader();

        objLoader.load(`./models/${objects[i]}`, function (obj) {
            obj.traverse( node=>{if (node.isMesh) node.material = material});
            obj.name = names[i];
            scene.add(obj);
        });
javascript
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Stranger in the Q
    2020-04-29T02:51:35Z2020-04-29T02:51:35Z

    要更改 y 纹理,THREE.MeshPhongMaterial只需更改参数并为现有材质map设置标志needsUpdate

       material.map = texture;
       material.needsUpdate = true;
    

    但是,纹理加载是一个异步操作,因此这些参数必须在图像加载后设置,在尚未加载的情况下。

    我从您的示例中更正了该功能,现在当您单击圆圈时,香蕉的纹理会发生变化。

    该方法的第二个参数load()是textureLoader纹理加载回调,我在其中放入了不会创建新材质而仅更改现有材质中的纹理的代码。

    function changeTexture(i) {
        let colorBlocks = document.querySelectorAll('.color_scheme__block');
        colorBlocks.forEach((val) => {
            val.onclick = () => {
                let value= val.style.background,
                    arr = value.split('/'),
                    result=arr[arr.length-1].slice(0,-2);
                textureObjLoader.load(`./models/${result}`, function(texture){
                    var mat = scene.getObjectByName( names[i], true).children[0].material;
                    mat.map = texture;
                    mat.needsUpdate = true;
                });
            };
        });
    }
    

    一般情况下的使用.children[0]是不正确的,但我并不聪明,因为有必要遍历对象中的所有网格以寻找必要的材料,因为 在一般情况下,模型中单个对象的材料可能不同,也可能不相同。但这是一首歌词,对于您的示例,代码可以正常工作

    每次单击按钮时创建新纹理也可能不是最佳选择,但这是一把双刃剑,这完全取决于纹理的数量和大小以及它们在应用程序中的使用性质(它们多久变化等)

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    根据浏览器窗口的大小调整背景图案的大小

    • 2 个回答
  • Marko Smith

    理解for循环的执行逻辑

    • 1 个回答
  • Marko Smith

    复制动态数组时出错(C++)

    • 1 个回答
  • Marko Smith

    Or and If,elif,else 构造[重复]

    • 1 个回答
  • Marko Smith

    如何构建支持 x64 的 APK

    • 1 个回答
  • Marko Smith

    如何使按钮的输入宽度?

    • 2 个回答
  • Marko Smith

    如何显示对象变量的名称?

    • 3 个回答
  • Marko Smith

    如何循环一个函数?

    • 1 个回答
  • Marko Smith

    LOWORD 宏有什么作用?

    • 2 个回答
  • Marko Smith

    从字符串的开头删除直到并包括一个字符

    • 2 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5