Skip to content

Instantly share code, notes, and snippets.

@max-mapper
Last active December 17, 2019 06:10
Show Gist options
  • Save max-mapper/4700570 to your computer and use it in GitHub Desktop.
Save max-mapper/4700570 to your computer and use it in GitHub Desktop.
smooth voxel terrain
var createGame = require('voxel-engine')
var isosurface = require('isosurface')
var game = window.game = createGame({meshType: "wireMesh"})
var THREE = game.THREE
// rotate camera to look straight down
game.controls.pitchObject.rotation.x = -1.5
var container = document.body
game.appendTo(container)
game.setupPointerLock(container)
Object.keys(game.voxels.chunks).map(function(ckey) {
var chunk = game.voxels.chunks[ckey]
var chunkPos = ckey.split('|').map(function(c) { return +c })
function lookup(x, y, z) {
var idx = x + y * 32 + z * 32 * 32
var val = chunk.voxels[idx]
return val - 1
}
var result = isosurface.surfaceNets(chunk.dims, lookup)
var mesh = meshIsosurface(result)
var w = game.cubeSize * game.chunkSize
mesh.position = {x: chunkPos[0] * w, y: chunkPos[1] * w, z: chunkPos[2] * w}
console.log(result, mesh.position)
game.scene.add(mesh)
})
function meshIsosurface(result) {
var geometry = new THREE.Geometry();
geometry.vertices.length = 0;
geometry.faces.length = 0;
for(var i=0; i<result.positions.length; ++i) {
var v = result.positions[i];
geometry.vertices.push(new THREE.Vector3(v[0], v[1], v[2]));
}
for(var i=0; i<result.faces.length; ++i) {
var f = result.faces[i];
if(f.length === 3) {
geometry.faces.push(new THREE.Face3(f[0], f[1], f[2]));
} else if(f.length === 4) {
geometry.faces.push(new THREE.Face4(f[0], f[1], f[2], f[3]));
} else {
//Polygon needs to be subdivided
}
}
geometry.computeFaceNormals();
geometry.verticesNeedUpdate = true;
geometry.elementsNeedUpdate = true;
geometry.normalsNeedUpdate = true;
geometry.computeBoundingBox();
geometry.computeBoundingSphere();
var material = new THREE.MeshNormalMaterial();
var surfacemesh = new THREE.Mesh( geometry, material );
surfacemesh.material.side = THREE.DoubleSide;
var wirematerial = new THREE.MeshBasicMaterial({
color : 0xff0000
, wireframe : true
});
wiremesh = new THREE.Mesh(geometry, wirematerial);
wiremesh.doubleSided = true;
surfacemesh.scale = {x:game.cubeSize, y:game.cubeSize, z:game.cubeSize}
return surfacemesh
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment