2016-04-29 3 views
8

Я пытаюсь отобразить вершины из 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); 
}; 

Я понимаю, что делать это с шейдерами имеет больше смысла, но я пока недостаточно знаю. Я предполагаю, что вы передадите частотные данные как единое целое, но затем я вернусь к своей первоначальной проблеме частотности в векторной манипуляции.

+0

Интересно. Таким образом, вы мутируете z каждой вершины в соответствии с частотными данными. Вместо того, чтобы зависеть от порядка плоскости (которую вы могли бы вычислить для цилиндра), почему бы просто не зависеть от положения x, y для поиска в ваших частотных данных? что-то вроде Math.floor (cylinderVerts [i] .x/cylinderLengthInX * numOfFrequencyDatums) – user01

+0

Я действительно не понимаю, что вы предлагаете, но изменение каких-либо vert.x, vert.y или vert.z приводит к исчезновению цилиндра поэтому мне нужно изменить весь вектор3. Я играл с умножением на скаляр и добавлением скаляра, но он не работал так, как мне нужно. –

+0

Извините, если я не понял. Я имел в виду, что вы оставляете x, y такими, какие они есть, и обновляете z для каждой вершины. Это каким-то образом исказит цилиндр, но, возможно, не будет полезным или желаемым способом. Могли бы опубликовать демонстрационную сцену на blo.ocks.org или где-нибудь? – user01

ответ