【问题标题】:Threejs Change image at runtimeThreejs在运行时更改图像
【发布时间】:2018-12-07 07:46:52
【问题描述】:

我正在展示一个 3d obj 并将纹理应用为 jpg。 但是我想在单击按钮时更改此图像,这是可能的,我该怎么做?

var loader = new THREE.ImageLoader(manager);
loader.load('models/obj/dla/dla.jpg', function(image) {
    texture.image = image;
    texture.repeat.set(1,1);
    texture.needsUpdate = true;
});

// model
var loader = new THREE.OBJLoader(manager);
loader.load('models/obj/dla/dla.obj', function(object) {

  object.traverse(function(child) {

  if (child instanceof THREE.Mesh) {

    child.material.map = texture;

  }

});

【问题讨论】:

  • 到目前为止你尝试过什么?看来您还缺少一些定义 texture 的代码。

标签: three.js


【解决方案1】:

如果更改材质的纹理/贴图,设置material.needsUpdate = true 很重要。

.needsUpdate : 布尔值

指定需要在 WebGL 级别更新材料。如果您进行了需要反映在 WebGL 中的更改,请将其设置为 true。 实例化新材质时,此属性会自动设置为 true。

这是一些代码,我将如何实现它。我也会使用TextureLoader而不是ImageLoader

// init
var obj;
var objLoader = new THREE.OBJLoader(manager);
var textureLoader = new THREE.TextureLoader(manager);

// load model
objLoader.load('models/obj/dla/dla.obj', function(object) {

  obj = object;
  loadTexture('models/obj/dla/dla.jpg', obj)

});

// load texture
function loadTexture(path, object) {
  textureLoader.load(path, function(texture) {
    object.traverse(function(child) {

      if (child instanceof THREE.Mesh) {

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

      }

    });
  });
}

// onclick handler
function onClick() {
  loadTexture('models/obj/dla/anotherTexture.jpg', obj);
}

如果您不再使用旧纹理,您可能希望将其从内存中丢弃。

...
if (child.material.map) child.material.map.dispose();

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

【讨论】:

  • 这个答案不正确。不需要通过设置material.needsUpdate = true;重新编译shader来改变纹理。
  • 嗯,可能是我弄错了。在我的代码中,它也可以在没有“needsUpdate = true”的情况下工作,因为我刚刚对其进行了测试。但这意味着其他答案在这件事上也是不正确的? stackoverflow.com/questions/16066448/…
  • needsUpdate = true 需要在新纹理上设置,或者在分配新纹理后在material.map 上设置。但是TextureLoader 为你设置了needsUpdate 标志。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多