【问题标题】:Three.js to visualize 3 slices of heatmaps in 3D spaceThree.js 在 3D 空间中可视化 3 片热图
【发布时间】:2021-07-07 01:44:52
【问题描述】:

我正在尝试使用 Three.js 来可视化 3D 矩阵。对于每个 2D 平面,我希望可视化为 2D 热图,它看起来像:

用户可以拖动每个平面来显示矩阵的不​​同切片。我现在遇到的问题是我无法在 Three.js 中找到将其可视化的最佳方式。我将热图中的每个单元格分别绘制为正方形并为其着色。但是,当矩阵的大小变得非常大时,比如 100000 * 500 * 200,绘制起来非常缓慢。

我对 3D 和 Three.js 非常陌生。我查看了一些示例,在我看来 Three.js 实际上可以通过使用粒子系统来可视化大量数据,但我不确定应该如何使用它。我在网上找到的一些示例不适用于最新版本的 Three.js。

其他要求是让用户能够缩放、旋转和平移可视化。

我发现一个很好的例子是http://www.georgeandjonathan.com/#1。在歌曲的结尾,它显示了一长串数据,您甚至可以旋转查看开头。

简而言之,我的问题是,考虑到大小,我可以使用 three.js 中的哪些技术来可视化此类绘图。

谢谢。

【问题讨论】:

  • 那肯定是很多数据......我想你可以使用自定义着色器的一种方法。作为 3D/Three.js 的新手,您可能已经看过这个术语,而且您可能还没有准备好应对它。但想法是您将数据作为 3D 矩阵(只是一个 3D 数组)传递,着色器将根据片段在空间中的位置将颜色应用于三个平面之一。这是我目前能想到的最节省内存的选项。
  • @TheJim01谢谢!我正在查看这个示例 threejs.org/examples/…,看看我是否能弄清楚着色器脚本是如何工作的。

标签: javascript 3d three.js


【解决方案1】:

在我浏览了几个示例之后,看起来使用由BufferGeometryPointsMaterial 构造的THREE.Points 足以可视化热图。

var PARTICLE_SIZE = 15;
var geometry = new THREE.BufferGeometry();
var material = new THREE.PointsMaterial({
    size:PARTICLE_SIZE;
    , vertexColors: THREE.VertexColors
});

var rowNumber = 200, columnNumber = 10000;
var particleNumber = rowNumber * columnNumber;
var positions = new Float32Array(particleNumber * 3);
var colors = new Float32Array(particleNumber * 3);
for (i = 0; i < rowNumber; ++i) {
    for (j = 0; j < columnNumber; ++j) {
        var index = (i * columnNumber + j) * 3;

        // put vertices on the XY plane
        positions[index] = rowIndex * PARTICLE_SIZE;
        positions[index + 1] = columnIndex * PARTICLE_SIZE;
        positions[index + 2] = 0;

        // just use random color for now
        colors[index] = Math.random();
        colors[index + 1] = Math.random();
        colors[index + 2] = Math.random();
    }
}
// these attributes will be used to render the particles
geometry.addAttribute('position', new THREE.BufferAttribute(positions, 3));
geometry.addAttribute('color', new THREE.BufferAttribute(colors, 3));
var particles = new THREE.Points(geometry, material);
scene.add(particles);

A good example 这对我有帮助。

有一个问题我还没有弄清楚,那就是所有的粒子一直都面向相机。当热图旋转时,这些粒子将始终面向您,因此整个平面的方向都会改变。当我找到解决方案时,我会发布我的更新。

【讨论】:

  • "...所有的粒子一直都朝向相机。"是的,他们会这样做。点没有体积——您可以将它们视为 3D 空间中的 1D 对象。正方形的大小只是为了使点可见。现在您可以使用粒子系统来帮助放置平面几何图形,但是您又回到了让数百万个三角形陷入场景的状态。不过,我很高兴您找到了适合您的解决方案。 :)
  • @TheJim01 您好,感谢您指出这一点。所以既然没有办法改变方向。你是说如果我尝试在几何图形中添加面以显示“真实”彩色方块,因此可以更改每个面的法线,然后我又回到原来的问题?但是着色器可以解决这个问题而不是放置三角形吗?
猜你喜欢
  • 1970-01-01
  • 2018-03-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-08
  • 2017-09-04
  • 2022-08-02
  • 2018-10-20
  • 2016-01-22
相关资源
最近更新 更多