node package manager
Orgs are free. Discover, share, and reuse code in your team. Create a free org »



The unholy union of three.js and Mikola Lysenko's ndarrays.

It's far more efficient to just use gl-now. See the voxel-mipmap-demo. But if you would like to use ndarrays with three.js then this is the library for you.



// initialize our modules 
var ndthree = require('ndthree')
var ndarray = require('ndarray')
var fill = require('ndarray-fill')
var terrain = require('isabella-texture-pack')
var THREE = require('three')
// Create some random voxels in a sphere 
var voxels = ndarray(new Uint16Array(32*32*32), [32,32,32])
fill(voxels, function(i,j,k) {
  var x = Math.abs(- 16)
  var y = Math.abs(- 16)
  var z = Math.abs(- 16)
  // (1<<15) toggles ambient occlusion 
  return (x*x+y*y+z*z) < 190 ? ((Math.random()*255)|0) + (1<<15) : 0
// Create our buffer geometry and shader material 
var geometry = new THREE.BufferGeometry()
var material = new THREE.ShaderMaterial()
// Populate the geometry and material 
ndthree(voxels, geometry, material)
// Restructure terrain ([256,256,4]) into a tile map shape ([16, 16, 16, 16, 4]) 
var tiles = ndarray(,
    [terrain.stride[0]*16, terrain.stride[1]*16, terrain.stride[0], terrain.stride[1], terrain.stride[2]], 0)
// Use helper for creating a mesh (optional) 
var mesh = ndthree.createMesh({
  geometry: geometry,
  material: material,
  map: tiles,
  size: 32,
  pad: true,


var ndthree = require('ndthree')

ndthree(ndarray, geometry, material)

  • ndarray should be 3 dimensional, eg [32, 32, 32].
  • geometry can be just an object but easier if a THREE.BufferGeometry.
  • material can be just an object but easier if a THREE.ShaderMaterial.


A helper for creating a three.js mesh from the previously created geometry and material.

  • options
    • THREE Pass in the instance of three.js. Required
    • geometry Pass in a THREE.BufferGeometry. Required
    • material Pass in a THREE.ShaderMaterial. Required
    • map|texture Pass in a ndarray texture tile map in the shape of [16, 16, 16, 16, 4].
    • offset Offset the mesh with this array. Default: [1, 1, 1]
    • pad Boolean whether to pad tile map. Default: true

Returns: A three.js mesh.


With npm do:

npm install ndthree

Use browserify to require('ndthree').

release history

  • 0.2.0 - Memory fixes. createMesh option changes.
  • 0.1.0 - initial release


Copyright (c) 2013 Kyle Robinson Young
Licensed under the MIT license.