2015-12-25 99 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上的「克隆」,但這並不意味着它可以擴展它,並具有與我的世界相同的功能。 –