使用 Node 在 THREE.js 中加载纹理
Loading a texture in THREE.js using Node
我正在尝试构建一个 Messenger 机器人,它在 3d 中进行一些图像处理和 returns 一个全新的图像。我使用 THREE.CanvasRenderer 并且我的应用托管在 Heroku 上。
当用户 /POST 附件到我的 webhook 时,我想获取新创建的图像的 URL 并将其插入到我的 3d 场景中。
这是我的代码(使用 node-canvas 库):
const addTexture = (imageUrl) => {
request({
uri: imageUrl,
method: 'GET'
}, (err, res, body) => {
let image = new Canvas.Image();
image.src = body;
mesh.material.map = new THREE.Texture(image);
mesh.material.needsUpdate = true;
});
}
回调得到 运行 并且我实际上可以 console.log()
图像的内容,但是场景中没有任何显示 - 我应该渲染到的平面只是变黑而没有任何错误.. . 我在这里错过了什么?
我也尝试了其他几种方法,都没有成功...
我尝试使用 THREE.TextureLoader
并用 jsdom (mock document
, window
) 和 node-xmlhttprequest
修补它,但是我的 load
出现错误] 事件(event.target 未定义...)就像 in this example
应该如何解决这个问题?我有一个由 Facebook 生成的 url
,我想从中下载图像并将其放置在我的场景中吗?
好了,半天搞定了,贴出来给后人看:
这是对我有用的代码:
const addTexture = (imageUrl) => {
request.get(imageUrl, (err, res, data) => {
if (!err && res.statusCode == 200) {
data = "data:" + res.headers["content-type"] + ";base64," + new Buffer(data).toString('base64');
let image = new Canvas.Image();
image.onload = () => {
mesh.material.map = new THREE.Texture(image);
mesh.material.map.needsUpdate = true;
}
image.src = data;
}
});
}
这样,我仍然得到一个错误:document is not defined
,因为它似乎在引擎盖下 three.js 将纹理写入一个单独的 canvas。
所以快速而丑陋的方法就是做我所做的:
document.createElement = (el) => {
if (el === 'canvas') {
return new Canvas()
}
}
我真的希望这对那里的人有所帮助,因为除了所有障碍之外,在服务器上渲染 WebGL 真是太棒了。
我正在尝试构建一个 Messenger 机器人,它在 3d 中进行一些图像处理和 returns 一个全新的图像。我使用 THREE.CanvasRenderer 并且我的应用托管在 Heroku 上。
当用户 /POST 附件到我的 webhook 时,我想获取新创建的图像的 URL 并将其插入到我的 3d 场景中。
这是我的代码(使用 node-canvas 库):
const addTexture = (imageUrl) => {
request({
uri: imageUrl,
method: 'GET'
}, (err, res, body) => {
let image = new Canvas.Image();
image.src = body;
mesh.material.map = new THREE.Texture(image);
mesh.material.needsUpdate = true;
});
}
回调得到 运行 并且我实际上可以 console.log()
图像的内容,但是场景中没有任何显示 - 我应该渲染到的平面只是变黑而没有任何错误.. . 我在这里错过了什么?
我也尝试了其他几种方法,都没有成功...
我尝试使用 THREE.TextureLoader
并用 jsdom (mock document
, window
) 和 node-xmlhttprequest
修补它,但是我的 load
出现错误] 事件(event.target 未定义...)就像 in this example
应该如何解决这个问题?我有一个由 Facebook 生成的 url
,我想从中下载图像并将其放置在我的场景中吗?
好了,半天搞定了,贴出来给后人看:
这是对我有用的代码:
const addTexture = (imageUrl) => {
request.get(imageUrl, (err, res, data) => {
if (!err && res.statusCode == 200) {
data = "data:" + res.headers["content-type"] + ";base64," + new Buffer(data).toString('base64');
let image = new Canvas.Image();
image.onload = () => {
mesh.material.map = new THREE.Texture(image);
mesh.material.map.needsUpdate = true;
}
image.src = data;
}
});
}
这样,我仍然得到一个错误:document is not defined
,因为它似乎在引擎盖下 three.js 将纹理写入一个单独的 canvas。
所以快速而丑陋的方法就是做我所做的:
document.createElement = (el) => {
if (el === 'canvas') {
return new Canvas()
}
}
我真的希望这对那里的人有所帮助,因为除了所有障碍之外,在服务器上渲染 WebGL 真是太棒了。