【问题标题】:THREE.js Mutating vertices of Plane according to Data from mp3THREE.js 根据 mp3 中的数据改变平面的顶点
【发布时间】:2023-03-30 00:44:01
【问题描述】:

所以我被卡住了一段时间,因为我一直无法根据 mp3 的频率数据动态更改位置几何形状中的顶点形状,我遇到了两个主要问题:

1) mp3 生成的数组值太多,无法快速渲染出顶点,因此,我正在使用此代码获取频率数据。

var frequencyData = new Uint8Array(analyser.frequencyBinCount);

2) 每次频率数据更改时重新渲染平面会导致极端的性能问题,以至于它不再渲染出来

我一直在使用单纯形噪声来使顶点变形,并且它确实有效,直到显然我传入频率数据并且一切都中断了,这是我试图用来变形平面顶点的代码听音乐。

function adjustVertices() {

      for (var i = 0; i < 100; i++) {
          for (var j = 0; j < 100; j++) {
              var ex = 0.5;
              pgeom.vertices[i + j * 100].z =
                  (noise.simplex2(i / 100, j / 100) +
                      noise.simplex2((i + 500) / 50, j / 50) * Math.pow(ex, frequencyData[2]) +
                      noise.simplex2((i + 400) / 25, j / 25) * Math.pow(ex, frequencyData[2]) +
                      noise.simplex2((i + 600) / 12.5, j / 12.5) * Math.pow(ex, frequencyData[2]) +
                      +(noise.simplex2((i + 800) / 6.25, j / 6.25) * Math.pow(ex, frequencyData[2]))) /
                  2;
              pgeom.verticesNeedUpdate = true;
              pgeom.computeVertexNormals();
          }
      }

  }

这是我的平面对象:

var pgeom = new THREE.PlaneGeometry(5, 5, 99, 99);
 var plane = THREE.SceneUtils.createMultiMaterialObject(pgeom, [
 new THREE.MeshPhongMaterial({
  color: 0x33ff33,
  specular: 0x773300,
  side: THREE.DoubleSide,
  shading: THREE.FlatShading,
  shininess: 3,
}),
]);



 scene.add(plane);

非常感谢大家的帮助,我只是在努力掌握three.js :)

【问题讨论】:

  • 我不熟悉 THREE.SceneUtils.createMultiMaterialObject .. afaik 你可以将材质数组传递给网格构造函数......所以:plane = new THREE.Mesh(pgeom,[new THREE.MeshPhong .. multimaterialonbject 有什么特别的作用吗?
  • 抱歉,最初我打算使用多材质对象来添加多种材质,但是我做了一些研究,发现它已被删除,您现在可以在材质数组中传递多种材质,所以我将 DEFO 更新它。
  • 我敢打赌,computeVertexNormals 计算是在该设置中减慢速度的原因。这是一个相对昂贵的操作,因为三个必须首先计算面法线,然后通过累积共享顶点的所有面法线来计算顶点法线..
  • 但这只是一个疯狂的猜测......瓶颈可能在其他地方。我必须查看一些正在运行的代码才能有更好的主意。

标签: three.js simplex-noise


【解决方案1】:

我会检查 computeVertexNormals 是否是该渲染循环中花费最多的时间,然后考虑优化它,如果您仍然需要它。

您可以通过在启动时构建一次网格拓扑来优化正常计算,因为它在运行时不会改变,从而使重新计算在恒定时间内运行。

然后减少顶点数,直到事情变得易于管理。 :)

【讨论】:

    【解决方案2】:

    第一个答案是正确的。最有可能计算顶点法线导致命中,并且最有可能发生这种情况是因为您似乎正在使用的Geometry 方法创建了很多new THREE.Vector3。如果您对此进行分析,我想您会看到很多 GC 活动,而不是太多的计算时间。

    由于您只映射一个变量,需要考虑的另一件事是在着色器中移动此计算。您可以将您的值写入纹理并仅对其进行更新。您不必刷新比仅存储输入变量所需的纹理大得多的顶点和法线缓冲区。您还可以并行执行此计算。

    【讨论】:

    • 是的。我考虑过这一点,但随后 OP 也必须在着色器中进行正常生成......如果你没有直接的函数来获取导数,这可能会很棘手。
    • 但是你对 computeVertexNormals 中的内存是正确的。预分配共享每个顶点的面列表并将法线生成减少到几个常量查找、添加和每个顶点 1 次归一化相对简单没有分配。
    猜你喜欢
    • 2015-05-17
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多