【问题标题】:Loading a texture in THREE.js using Node使用 Node 在 THREE.js 中加载纹理
【发布时间】:2017-06-05 11:18:47
【问题描述】:

我正在尝试构建一个 3D 图像处理并返回全新图像的信使机器人。我使用 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(模拟documentwindow)和node-xmlhttprequest 对其进行修补,但是我的load 事件出现错误(event.target 未定义... ) 就像in this example

应该如何解决这个问题?我有一个由 Facebook 生成的url,我想从中下载图像并将其放置在我的场景中?

【问题讨论】:

  • 你用的是什么版本的three.js?

标签: node.js three.js node-canvas


【解决方案1】:

好的,半天搞定了,发给后人看:

这是为我解决问题的代码:

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 将纹理写入单独的画布。

所以快速而丑陋的方法是做我所做的:

document.createElement = (el) => {
    if (el === 'canvas') {
        return new Canvas()
    }
}

我真的希望这对那里的人有所帮助,因为除了所有障碍之外,在服务器上渲染 WebGL 真是太棒了。

【讨论】:

  • 很高兴你发布了这个!如果它在我的情况下有效。你能告诉我你在实际渲染中使用的是什么吗?我经历了 headless-gl、node-webgl、软件渲染器,我不知道在过去的 12 小时内还有多少其他人。没有纹理的骰子。当你看到这个时,我会很感激你的帮助!
  • 嘿,我正在使用 THREE.CanvasRenderer。由于 THREE 使用单独的 2d 画布来写入纹理,这显然在 Node.js 中不受支持,我不得不使用github.com/Automattic/node-canvas 来修补它(另见我丑陋的 document.createElement 补丁,所以它返回新的帆布())。我不久前做了这个项目,并不是所有的东西都在我的记忆中,但你可以查看github.com/gnikoloff/messenger-bot-vaporwavify-me,项目背后的回购 :) 祝你好运!
  • 谢谢乔治!我会试一试。画布不是只能做 WebGL 的一部分吗?您是否注意到浏览器和服务器版本之间的渲染差异很大?
  • 是的,没错,canvas2d 是有限的。它归结为仅使用 GPU 进行渲染的画布,而使用 WebGL,您可以卸载动画逻辑并在 GPU 上渲染。对于我的简单项目,我没有渲染差异的问题,我想这取决于你所追求的。我不确定你是否可以使用 CanvasRenderer 来使用 ShaderMaterial 等高级东西......
  • 我要看看我能走多远。可惜headless-gl 已经死了; WebGL 上的服务器端渲染现在似乎是一场艰苦的战斗。
猜你喜欢
  • 2013-06-28
  • 2023-04-09
  • 2015-05-30
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-11
  • 2013-08-03
相关资源
最近更新 更多