【问题标题】:Drawing a cube a million times画一个立方体一百万次
【发布时间】:2015-12-26 15:18:10
【问题描述】:

我需要使用一个尺寸为 1x1x1 的立方体构建地形,坐标在 .txt 文件中提供,大约有 1100 万个三元组。

问题是,使用我当前的代码我只能绘制大约 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);
}

在 $.ajax 调用中成功调用该函数。

注释部分在没有合并几何的情况下使用,这样我可以绘制大约 100k 的数据。

谢谢你帮助我。

编辑:我看到了this question,但对我没有多大帮助。

【问题讨论】:

标签: javascript three.js geometry


【解决方案1】:

您正在寻找的是体素渲染。实现此目的的两个主要渲染路径: A) 体积渲染,但 webgl 缺乏硬件 3d 纹理支持。 B) 网格表面生成和标准多边形渲染。可能是您唯一的选择。不要认为公开有什么好的高效 js 实现。

你需要做什么。

  1. 把你的世界分成相同维度的块,块 尺寸可能需要是 2 的幂以允许更快 对它们进行操作。
  2. 想出一个可以存储 11M 体素数据的数据结构。 这可能需要在 Int32Arrays 的某种排列中并使用 按位运算符访问/存储每个体素上的数据。

  3. 为每个块生成表面网格。见link

  4. 对于远离相机的区块,想出一些方案 可以生成低 LOD 的网格(可选)。
  5. 从前到后渲染可见截头体中的所有块 订购。

【讨论】:

  • 我不确定你对高效的定义是什么,但肯定有很多 webgl minecraft 克隆。在谷歌上搜索“minecraft webgl”会找到this librarythis example 以及其他很多人。
  • 感谢您的回答!数据结构应该是什么样的?我认为它可能是一个 1 块厚的大型 MxN 多边形,因为我正在构建一个看起来像 this 的地形,有 60k 个立方体 @gman 我看到了 voxeljs,但我不知道如何使用我的数据,即使如果可以的话它会很完美,有什么帮助吗?
  • @gman 显示多个看似由立方体组成的静态网格并不难。您可以在 shadertoy 上找到少于 200 行代码的 minecraft “克隆”,但这并不意味着您可以扩展它并拥有与 minecraft 相同的功能。
  • @gman OP 需要渲染 11M 体素。作为地形。可能有未指定的附加要求。如果您可以使用您链接的工具之一演示如何执行此操作,我相信 OP 将不胜感激。
  • @Mark, game.setBlock(pos, 1) 创建体素或加载您的数据并编写一个函数,generate 可以使用该函数查看您的数据 like this
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 2012-11-04
  • 2011-02-11
相关资源
最近更新 更多