Я пытаюсь отобразить вершины из AudioContext api в Three.js.Вершина Displacment с аудиоконтекстом (THREE.JS R76)
Теперь я успешно сделал это с самолетами (без шейдеров), но у меня проблемы с попыткой применить его к цилиндру. Поскольку вершины цилиндра являются полными векторами, а не 0 для плоскости, я не знаю, как я буду сопоставлять их с frequencyData.
Я включаю некоторые дополнительные функции для будущих зрителей, которые ищут аудиоконтекст.
Аудио Context
function audioLink(){
player = document.getElementById('musicPlayer'),
context = new (window.AudioContext || window.webkitAudioContext),
analyser = context.createAnalyser(),
source = context.createMediaElementSource(player);
source.connect(analyser);
analyser.connect(context.destination);
analyser.fftSize = 256;
frequencyData = new Uint8Array(analyser.frequencyBinCount);
analyser.getByteTimeDomainData(frequencyData);
}
Вот мой код для верхней и нижней плоскости ...
function updateVertWave(){
for (var i = 0, len = waveBottom.geometry.vertices.length; i < len; i++) {
waveBottomVert[i].z = frequencyData[i]*6;
waveTopVert[i].z = frequencyData[i]*-6;
}
waveBottom.geometry.verticesNeedUpdate = true;
waveTop.geometry.verticesNeedUpdate = true;
}
STUCK ЗДЕСЬ
function updateVertCylinder(){
for (var i = 0, len = cylinder.geometry.vertices.length; i < len; i++) {
(STUCK)
}
cylinder.geometry.verticesNeedUpdate = true;
cylinder.geometry.computeFaceNormals();
cylinder.geometry.computeVertexNormals();
scene.getObjectByName("cylinder").rotation.y += 0.004;
}
Рендер
function render() {
renderFrame = requestAnimationFrame(render);
analyser.getByteFrequencyData(frequencyData);
if (planeViz) {
updateVertWave();
} else {
updateVertCylinder();
}
renderer.render(scene, camera);
};
Я понимаю, что делать это с шейдерами имеет больше смысла, но я пока недостаточно знаю. Я предполагаю, что вы передадите частотные данные как единое целое, но затем я вернусь к своей первоначальной проблеме частотности в векторной манипуляции.
Интересно. Таким образом, вы мутируете z каждой вершины в соответствии с частотными данными. Вместо того, чтобы зависеть от порядка плоскости (которую вы могли бы вычислить для цилиндра), почему бы просто не зависеть от положения x, y для поиска в ваших частотных данных? что-то вроде Math.floor (cylinderVerts [i] .x/cylinderLengthInX * numOfFrequencyDatums) – user01
Я действительно не понимаю, что вы предлагаете, но изменение каких-либо vert.x, vert.y или vert.z приводит к исчезновению цилиндра поэтому мне нужно изменить весь вектор3. Я играл с умножением на скаляр и добавлением скаляра, но он не работал так, как мне нужно. –
Извините, если я не понял. Я имел в виду, что вы оставляете x, y такими, какие они есть, и обновляете z для каждой вершины. Это каким-то образом исказит цилиндр, но, возможно, не будет полезным или желаемым способом. Могли бы опубликовать демонстрационную сцену на blo.ocks.org или где-нибудь? – user01