2015-12-25 179 views
1

我需要使用一个尺寸为1x1x1的立方体构建地形,坐标以.txt文件形式提供,并且大约有11M三元组。绘制一百万次的立方体

问题是,使用我当前的代码,我只能画出大约60k,然后浏览器选项卡被重置,并提示停止无响应的脚本出来,所以我用了太多的内存和时间来生成它们。

这里的代码块我用它来吸引他们:

function generateCubes(data) { 
    var cubeGeometry = new THREE.CubeGeometry(cubeSize, cubeSize, cubeSize); 
    var material = new THREE.MeshLambertMaterial({color: 0x587058}); 
    var mesh = new THREE.Mesh(cubeGeometry, material); 
    var mergedGeo = new THREE.Geometry(); 
    var instance; 
    var line = data[0].split(';'); 
    var translateX = line[0], translateY = line[1], translateZ = line[2]; 
    //var group = new THREE.Object3d(); 
    for(var i = 0; i < 100000; i++) { // should go to data.length 
     line = data[i].split(';'); 
     //instance = mesh.clone(); 
     //instance.position.set(line[0] - translateX, line[2] - translateZ, line[1] - translateY); 
     //group.add(instance); 
     mesh.position.x = Number(line[0]) - translateX; 
     mesh.position.y = Math.round(Number(line[2]) - translateZ); 
     mesh.position.z = Number(line[1]) - translateY; 
     mesh.updateMatrix(); 
     mergedGeo.merge(instance.geometry, instance.matrix); 
    } 
    group = new THREE.Mesh(mergedGeo, material); 
    scene.add(group); 
} 

的功能是从所谓的成功在$就调用。

评论部分使用没有合并的几何,这样我可以绘制大约100k的数据。

谢谢你帮助我。

编辑:我看到this question它并没有帮助我很多。

+1

你应该看看这个例子:http://alteredqualia.com/three/examples/webgl_cubes.html – gaitat

+0

我敢肯定你不能得出11M对象与个别平局甚至是从C调用++。看看[instancing](http://blog.tojicode.com/2013/07/webgl-instancing-with.html) –

回答

3

你在找什么是体素渲染。两个主要的渲染路径来完成这一点:A)体积渲染,但webgl缺乏硬件3d纹理支持。 B)网格曲面生成和标准多边形渲染。可能是唯一的选择。不要认为在公开场合有任何高效的js实现。

你需要做什么。

  1. 把你的世界在同一尺寸的大块,大块 尺寸大概需要是2的幂,以允许在他们更快 操作。
  2. 想出一个可以存储11M体素数据的数据结构。 这可能需要在Int32Arrays的某些排列中,并使用位明智的运算符来访问/存储每个体素上的数据。

  3. 对于每个块,生成表面网格。见link

  4. 对于远离摄像头的组块,想出一些方案,其中 可以生成低LOD网格(可选)。
  5. 在前后可见的平截头体中呈现所有块的顺序为 。
+1

我不确定你的效率定义是什么,但肯定有很多webgl minecraft克隆。谷歌搜索“我的世界webgl”提出了[这个图书馆](http://voxeljs.com/)和[这个例子](http://benvanik.github.io/blk-game/)和其他吨。 – gman

+0

谢谢你的回答!数据结构应该如何?我认为这可能是一个很大的MxN多边形,它的厚度为1块,因为我正在建造一个看起来像[这个](http://i.imgur.com/7ZsanUp.png),具有60k立方体的地形 @gman我看到voxeljs,但我不知道如何使用我的数据构建自定义地形,尽管如果可以的话,它会是完美的,有什么帮助? – Mark

+0

@gman显示由多维数据集组成的多个静态网格并不困难。你可以在不到200行的代码中找到我们在shadertoy上的“克隆”,但这并不意味着它可以扩展它,并具有与我的世界相同的功能。 –