【发布时间】: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 计算是在该设置中减慢速度的原因。这是一个相对昂贵的操作,因为三个必须首先计算面法线,然后通过累积共享顶点的所有面法线来计算顶点法线..
-
但这只是一个疯狂的猜测......瓶颈可能在其他地方。我必须查看一些正在运行的代码才能有更好的主意。