2016-11-22 69 views
0

我需要在服务器上运行WebGLRenderer,但对此有不同的声音。有人说这是不可能的,有人说他们是试图让得到它的工作,但那是讨论结束的时候。是否可以在node.js服务器上运行Three.js WebGLRenderer?

是否可以做到这一点,在这种情况下,有什么办法?有可能使用moch-browser与node-gl或其他东西结合使用吗?

[编辑] 加入溶液

+0

什么打算与所绘制的结果呢?将其流回到用户的浏览器或保存到文件或...? – Matey

+0

@Matey以流的形式将其返回给用户。 – JakobMillah

+0

流式传输PNG序列?或发送一个PNG文件? – Matey

回答

1

这是我自己的问题的解决方案。根据场景及其对象的大小,可能需要一些时间。在我的情况下,我想返回相当小的对象版本,但仍需要大约400毫秒才能响应400x400px png。希望这可以帮助那里的人!

enter image description here

Server.js

var THREE = require("three.js"); 

// Create a DOM 
var MockBrowser = require('mock-browser').mocks.MockBrowser; 
var mock = new MockBrowser(); 
var document = MockBrowser.createDocument(); 
var window = MockBrowser.createWindow(); 

//REST API 
var express  = require('express');  
var app   = express();  
var bodyParser = require('body-parser'); 
var router = express.Router(); 

var gl = require('gl')(1,1); //headless-gl 

var pngStream = require('three-png-stream'); 
var port = process.env.PORT || 8080; 

router.get('/render', function(req, res){ 

    var scene = new THREE.Scene(); 
    var camera = new THREE.PerspectiveCamera(75, this.width/this.height, 0.1, 1000); 
    var renderer = new THREE.WebGLRenderer({context:gl}); 

    scene.add(camera); 

    renderer.setSize(this.width, this.height); 
    renderer.setClearColor(0xFFFFFF, 1); 

    /*... 
     Add your objects & light to the scene 
    ...*/ 

    var target = new THREE.WebGLRenderTarget(this.width, this.height); 
    renderer.render(scene, camera, target); 


    res.setHeader('Content-Type', 'image/png'); 
    pngStream(renderer, target).pipe(res); 
}); 

app.use('/api', router); 

app.listen(port); 
console.log('Server active on port: ' + port); 
相关问题