当我更改纹理(相同路径)时,它会加载第一个负载

When I change the texture (same path) it load the first load

我可以使用

更改具有不同路径的对象的纹理图像
 //create textureMaterial
function CreateTextureMaterial(ImageName){
    var Texture = new THREE.ImageUtils.loadTexture('texture/'+ImageName); 
    var Material = new THREE.MeshBasicMaterial({ 
    map:Texture});
    return Material;
}
//change Texture
function ChangeTexture(ObjectName, TextureMaterial){
    obj = view3D.scene.getObjectByName(ObjectName);
    obj.material = TextureMaterial;
    //if render bad(wrong uvmap) use obj.material.materials[number]
}

在我的站点中,用户加载了一张图片,它始终以相同的路径存储(例如 texture/usertexture.jpg),当我更改默认设置时程序加载图片

ChangeTexture(ObjectName,CreateTextureMaterial(path))

但是如果我改变图像(路径总是相同的)并且调用相同的函数

$('element').load('page.php',ChangeTexture(ObjectName,CreateTextureMaterial(path))

它加载第一张图片而不是更新的图片...

我认为它能做到这一点是因为它存储在浏览器的某处,所以...我在哪里可以找到它并将其从内存中删除?

我已经检查过缓存但是它是免费的...

在重新加载纹理之前尝试 运行 此代码:

THREE.Cache.remove(url);

其中 url 是图片的路径。

也尝试向图像 url 添加一些随机数据,例如 ?rand=3123131。这应该可以防止浏览器缓存图像。

在这种情况下,我尝试使用从裁剪器 canvas 捕获的图像更改纹理(如 https://github.com/fengyuanchen/cropper),我将图像直接用于对象,而不是将其保存在服务器上并使用存储在 var Texture = new THREE.ImageUtils.loadTexture('texture/'+ImageName) 中的新图像;

我直接获取输出数据,放到纹理中

var texture = new THREE.Texture();
texture.image = result;
texture.needsUpdate = true;
var material = new THREE.MeshBasicMaterial({
map:texture});
var obj = scene.getObjectByName('myobject');
obj.material.materials[0] = material;

其中结果是图像(类似于 "data:image/png;base64,iVBORw0KG...") 如果它不起作用,您可能需要将结果与方法 result.toDataURL

一起使用