////////////////////////////////////////// float fTentacleMoveScale = 1.0f; ////////////////////////////////////////// class SceneTentacles extends Scene { SceneTentacles() { super(); m_fRZ = 0; m_iNumTentacles = 30; m_aTentacles = new Tentacle[m_iNumTentacles]; for (int i = 0; i < m_iNumTentacles; i++) { PVector vecPos = new PVector(random(-1000, 1000), random(-1000, 1000), random(-1000, 1000)); m_aTentacles[i] = new Tentacle(vecPos, (int)random(5, 10), (int)random(iNumAverages / 5, iNumAverages)); } m_iFocus = 0; m_vecFocusPos = m_aTentacles[0].m_vecPos.get(); } void Draw() { super.Draw(); viewManager.SetViewType(3); float fRotEye = fTime * 0.5; PVector vecDiff = m_aTentacles[m_iFocus].m_vecPos.get(); vecDiff.sub(m_vecFocusPos.get()); vecDiff.mult(0.01); m_vecFocusPos.add(vecDiff); camera(sin(fRotEye)*500, 0, cos(fRotEye)*500, m_vecFocusPos.x, m_vecFocusPos.y, m_vecFocusPos.z, 0, 1, 0); for (int i = 0; i < m_iNumTentacles; i++) { m_aTentacles[i].Update(); m_aTentacles[i].Draw(); } } void Kick() { super.Kick(); m_iFocus = (int)random(m_iNumTentacles); fTentacleMoveScale *= -1; } float m_fRZ; int m_iNumTentacles; Tentacle[] m_aTentacles; int m_iFocus; PVector m_vecFocusPos; } ////////////////////////////////////////// class Tentacle { Tentacle(PVector vecPos, int iNumSegments, int iFreq) { m_vecPos = vecPos; m_iNumSegments = iNumSegments; m_fRootRotZ = 0; m_fRotZ = new float[iNumSegments]; for (int i = 0; i < m_iNumSegments; i++) { m_fRotZ[i] = 0; } m_iFreq = iFreq; } void Update() { float fRotZ = fft.getAvg(m_iFreq) * 0.5 * fTentacleMoveScale; m_fRootRotZ += fRotZ * 0.2; m_fRotZ[0] = m_fRotZ[0] * 0.8 - fRotZ * 0.3; for (int i = 1; i < m_iNumSegments; i++) { m_fRotZ[i] = m_fRotZ[i] * 0.8 + m_fRotZ[i-1] * 0.3; } } void Draw() { pushMatrix(); translate(m_vecPos.x, m_vecPos.y, m_vecPos.z); rotateZ(m_fRootRotZ); strokeWeight(5); stroke(140,150,20); fill(30,45,100); box(50); for (int iTentacle = 0; iTentacle < 5; iTentacle++) { pushMatrix(); for (int i = 0; i < m_iNumSegments; i++) { float fSize = (1 - (float)i / m_iNumSegments) * 50; translate(fSize * 1.2, 0, 0); // rotateX(min(fft.getAvg(10) * 0.1, 1) - 0.5); rotateZ(max(min(0.5, m_fRotZ[i]), -0.5)); box(fSize); } popMatrix(); rotateZ(PI*2/5); } popMatrix(); } PVector m_vecPos; float m_iNumSegments; float m_fRootRotZ; float[] m_fRotZ; int m_iFreq; }