我知道以前有人问过这个问题,我也读过我能找到的问题和答案,但都不管用。
我在一个本地服务器(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";
或的一些变体放在代码的开头、结尾和其他不同的位置。
<?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>
但那不起作用,这在www.example.com上也不起作用bitbucket.org,这对我来说意味着我的代码中缺少了一些东西。
它似乎在sphere.material = new THREE.MeshBasicMaterial({map: mapOverlay, needsUpdate: true});;
行失败了,好像我注解掉了它就没有错误了(但是网格没有更新)。
我真的不知道还有什么可以尝试这里,任何帮助将不胜感激。
6条答案
按热度按时间zu0ti5jz1#
更新
在较新版本的THREE.js中,默认情况下处理跨源图像。
THREE.ImageUtils.loadTexture
已弃用。通常使用TextureLoader
原始答案
这个管用
这里有一个样本
一个一个二个一个一个一个三个一个一个一个一个一个四个一个
注意:不能将
new
与THREE.ImageUtils.loadTexture
一起使用为了将一张图片"交叉来源"加载到WebGL中,发送图片的服务器必须用正确的标题进行响应。你说你想使用图片"交叉来源"是不够的,你所做的只是告诉服务器你正在请求使用该图片的权限。
你可以设置
img.crossOrigin
,或者在THREE的情况下设置THREE.ImageUtils.crossOrigin
为''
或'anonymous'
,'anonymous'
与''
相同,或者设置为'use-credentials'
,'use-credentials'
会向服务器发送更多的信息,浏览器会看到你设置了crossOrigin
,并向服务器发送特定的报头,服务器读取这些报头,决定你的域名是否有权限使用该图片,如果你有权限,它会将某些标题发送回浏览器。浏览器,如果它看到这些标题,然后让你使用该图片。最重要的一点是服务器必须发送头文件。大多数服务器不发送这些头文件。www.example.com显然会发送。我怀疑bitlocker不会,尽管我没有测试它。imgur.com does apparently. I suspect bitlocker does not though I didn't test it.
你也必须设置
crossOrigin
,如果你不这样做,浏览器将不允许你使用img,即使服务器发送了正确的头部,你也不应该这样做。6tdlim6h2#
UPDATE:已弃用的方法
我遇到了这个问题,并应用了答案中的解决方案,发现由于THREE.js的新版本中的方法已被弃用,它无法正常工作。我发布此答案,以防有人遇到同样的问题。尽管已被弃用,但gman在原始答案中提供的信息是最有帮助的,我建议阅读它。
方法自最初的问题和答案以来已弃用。
当前加载纹理的方式:
eivgtgni3#
我发现了一个解决图像和JSON模型的跨域问题的方法。这个方法总是有效的,在Localhost上也是如此。
在我的例子中,我从端口3001的NodeJS加载游戏,以使用Socket.io。我需要端口80的3d模型。
假设所有模型都在目录中:游戏/分发/型号/* /
我创建了一个PHP文件game/dist/models/json. php:
三个JS:
好好玩!
p5fdfcr14#
A screencapture of the error
刚刚遇到了同样的问题,而我的codepen演示工作:https://codepen.io/fritx/project/editor/AoLRoy
通过将three.js从0.86升级到〉=0.87解决
9avjhtql5#
在图像URL末尾添加“?not-from-cache-please”作为TextureLoader中的参数。
kcwpcxri6#
您也可以使用它:https://stackoverflow.com/a/75208933/18133340此选项告知服务器不要使用缓存加载映像