2016-04-29 16 views
8

Próbuję odwzorować wierzchołki z api AudioContext w pliku Three.js.Rozkład pionów z kontekstem audio (THREE.JS R76)

Teraz z powodzeniem wykonałem to z płaszczyznami (bez shadera), ale mam problemy z próbą zastosowania go do cylindra. Ponieważ wierzchołki cylindrów są pełnymi wektorami, zamiast zer w płaszczyźnie, nie wiem, jak je zmapować do częstotliwości.

Mam pewne dodatkowe funkcje dla przyszłych widzów szukających Kontekstu Audio.

audio Kontekst

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);  
} 

Oto mój kod na górnej i dolnej płaszczyzny ...

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; 
} 

zakleszczony tutaj

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; 
} 

Render

function render() { 
renderFrame = requestAnimationFrame(render); 
analyser.getByteFrequencyData(frequencyData); 
if (planeViz) { 
    updateVertWave(); 
} else { 
    updateVertCylinder(); 
} 
renderer.render(scene, camera); 
}; 

Rozumiem, że robienie tego za pomocą shaderów ma więcej sensu, ale jeszcze nie wiem wystarczająco dużo. Przypuszczam, że przekażesz dane o częstotliwości jako jednolitą, ale zaraz powróciłem do mojego pierwotnego problemu freq do manipulacji wektorowej.

+0

Interesujące. Więc mutujesz z każdego wierzchołka zgodnie z danymi częstotliwości. Zamiast zależeć od kolejności samolotu (którą można obliczyć dla cylindra), dlaczego nie polegać tylko na pozycji x, y, aby sprawdzić w danych częstotliwości? coś takiego jak Math.floor (cylinderVerts [i] .x/cylinderLengthInX * numOfFrequencyDatums) – user01

+0

Nie bardzo rozumiem co proponujesz, ale zmiana samego vert.x, vert.y lub vert.z powoduje zniknięcie cylindra dlatego muszę zmienić cały wektor3. Grałem z pomnożeniem przez skalar i dodałem skalar, ale nie działało tak, jak potrzebuję. –

+0

Przepraszam, jeśli byłem niejasny. Chodziło mi o to, że opuszczasz x, y, jak są, i aktualizujesz z dla każdego vertu. To może w jakiś sposób zniekształcić cylinder, ale być może nie w użyteczny lub pożądany sposób. Czy mógłbyś opublikować scenę demo na blo.ocks.org lub gdzieś? – user01

Odpowiedz

Powiązane problemy