Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I render three.js in node.js?

Tags:

How do I render three.js code in node.js?

I'd like to export from blender, then open the export through fs and render a scene with it.

like image 923
dansch Avatar asked Oct 03 '13 14:10

dansch


People also ask

Does Three Js work on node?

three works fine under node, only three/examples/jsm does not. you will have better luck with GitHub - pmndrs/three-stdlib: Stand-alone library of threejs examples designed to run without transpilation in node & browser which mostly runs fine, but loaders for instance still rely on web apis.

How do I run a 3 js file?

If you use just procedural geometries and don't load any textures, webpages should work straight from the file system, just double-click on HTML file in a file manager and it should appear working in the browser (you'll see file:///yourFile.html in the address bar).

How many vertices can three Js handle?

js) and just render an ultra-simple point-cloud with one fragment rendered per point, you can easily get to rendering 10-20 million (yes, million) points/vertices on an average GPU.


1 Answers

This is kind of a smelly implementation, but the key parts to remember are the part where the geometry is created, everything else is pretty straightforward. I'm mostly putting this here for my own reference later, but it does work and it's cool to have 3d rendering in nodejs. oh yea it requires canvas to work too.

it relies on three.js npm module https://github.com/uniba/node-three.js

fs = require("fs")  THREE = require("three.js") join = require("path").join  app.get '/test/top_:top_id/side_:side_id/x_:x/y_:y.jpg', (req, res, next) =>    width = 660   height = 500    camera = new THREE.PerspectiveCamera(50, width / height, 1, 1000)   scene = new THREE.Scene()   renderer = new THREE.CanvasRenderer( )   renderer.setSize width, height    camera.position.z = 100    camera_container = new THREE.Object3D   scene.add camera_container   camera_container.add camera    camera.position.z = 75    # We have one background plane   plane_image = new Image   plane_image.src = fs.readFileSync TOP_DIR + "public/images/vtx_logo.jpg"   texture = new THREE.Texture plane_image, new THREE.UVMapping()   texture.needsUpdate = true    loader = new THREE.JSONLoader()    geometry = new THREE.PlaneGeometry(200, 200)   material = new THREE.MeshBasicMaterial     color       : 0x698144     #shading        : THREE.SmoothShading     map     : texture     overdraw: true   plane = new THREE.Mesh geometry, material   plane.position.z = -50   plane.position.y = -4   plane.position.x = 4.5    # We also have an object in the foreground   scene.add plane   geometry = false   loader.createModel JSON.parse(fs.readFileSync(TOP_DIR + 'public/blender_export.json')), (done) =>     geometry = done    # Imager.texture gives us a canvas based on some code that grabs specific info   texture = new THREE.Texture (Imager.texture req.params.side_id, req.params.top_id), new THREE.UVMapping()   texture.needsUpdate = true    material = new THREE.MeshBasicMaterial     color: 0xaaaaaa     map: texture     overdraw: true   mesh = new THREE.Mesh geometry, material    mesh.rotation.x = parseFloat req.params.x   mesh.rotation.y = parseFloat req.params.y    scene.add mesh   mesh.dynamic = true   renderer.render scene, camera    renderer.domElement.toBuffer (err, buf) ->     res.contentType 'image/jpg'     res.send buf 

If you get an error cannot find ./lib/Three:

The three.js module I mentioned might point to an old version of three internally. I remember having to go into the module and edit a file that require('./lib/Three') to require('./lib/three'). I guess he included a non specific three in his package.json, so it got updated without his npm module being updated.. could be fixed by now

like image 172
dansch Avatar answered Sep 17 '22 15:09

dansch