我知道这个问题之前已经被问过了,我已经阅读了所有能找到的问题和答案,但是没有一个有效果。
我正在本地服务器(IIS)上运行。我试图从imgur加载一张图片,然后使用以下代码将其作为物体的纹理:
var savedImage = /[^?]*$/.exec(location.search)[0];
if (savedImage != "") { savedImageLoad("http://i.imgur.com/" + savedImage + ".jpg"); };
function savedImageLoad(image) {
var mapOverlay = new THREE.ImageUtils.loadTexture(image);
sphere.material = new THREE.MeshBasicMaterial({map: mapOverlay, needsUpdate: true});;
sphere.geometry.buffersNeedUpdate = true;
sphere.geometry.uvsNeedUpdate = true;
}
但是它提示错误:
Uncaught SecurityError: Failed to execute 'texImage2D' on 'WebGLRenderingContext': The cross-origin image at http://i.imgur.com/uBD0g95.jpg may not be loaded.
我尝试在代码的开头、结尾和其他各个位置放置THREE.ImageUtils.crossOrigin = "anonymous";
或其变体,同时添加了一个web.config文件。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
</customHeaders>
</httpProtocol>
</system.webServer>
</configuration>
但是那并没有起作用,这个问题同样也出现在托管在bitbucket.org上的网站中,这告诉我我的代码还有缺陷。 似乎它在
sphere.material = new THREE.MeshBasicMaterial({map: mapOverlay, needsUpdate: true});
这一行出现了错误,如果我注释掉这行代码,则不会出现错误(但网格就无法更新)。
我真的不知道还有什么尝试的方法,在此感谢任何帮助。
new
关键字。移除new
似乎让它正常工作了。谢谢! - Kurtnew THREE.TextureLoader()
,你仍然可以使用THREE.TextureLoader.prototype.crossOrigin = '';
来设置它们的跨域策略。 - Andy Rayloader.crossOrigin = '';
的更新实现,并且有效。 - sanjsanj