Статьи

Визуализируйте забавный звуковой визуализатор с Away3D

В этом уроке я расскажу вам, как построить спектр трехмерных вычислений. Мы будем использовать Away3D для 3D Engine и использовать образец песни из библиотеки ресурсов Envato.




Создайте новый файл ActionScript3.

«Away3D

На панели «Свойства» нажмите кнопку «Изменить».

«Away3D

Выберите профиль Flash Player 9 и нажмите «ОК».

отсутствующий флэш-визуализатор

Сохраните ваш файл как «Compute Spectrum.fla» в папке «Compute Spectrum». Теперь вам нужно скачать движок Away3D с Away3D Downloads . Мы будем использовать версию 2.3.3 для Flash Player 9. Распакуйте архив и скопируйте все папки в папку Compute Spectrum.

В анимации мы подготовим ходы в соответствии с голосом. Поэтому нам нужно правильно выбрать нашу песню. Аудитория должна действительно чувствовать; «Вау, это движется внутри звука». Если вы загрузите исходный файл, вы увидите song.mp3. Скопируйте его в папку Compute Spectrum. Ваша папка должна теперь выглядеть так:

отсутствующий флэш-визуализатор

ОК, мы готовы начать кодирование. Мы заполним первые строки, импортируя наши классы:

1
2
3
4
5
import away3d.cameras.*;
import away3d.containers.*;
import away3d.materials.*;
import away3d.primitives.*
import away3d.lights.DirectionalLight3D

После импорта наших классов мы определяем наши переменные для использования на следующих этапах.

1
2
3
4
var scene:Scene3D;
var camera:HoverCamera3D;
var view:View3D;
var light:DirectionalLight3D;
1
2
3
4
5
6
7
8
9
var bars_up:Array = new Array();
var bars_down:Array = new Array()
var soundbyte:ByteArray = new ByteArray();
var soundforces:Array = new Array()
var scaleoffset_low:Number = 15;
var scaleoffset_mid:Number = 150;
var scaleoffset_hig:Number = 150;
var i:int;
var t:Number;

Первые из них для Away3D. Массив bars_up содержит наши основные бары. bars_down для отраженных баров. soundforces и soundbyte предназначены для вычислительного спектра. Наконец, смещения масштаба предназначены для масштабирования баров.

Теперь нам нужно собрать Away3D.

1
2
function initAway3D():void {
  scene = new Scene3D();
1
2
camera = new HoverCamera3D();
  camera.distance = 300
1
2
3
4
5
6
7
8
light = new DirectionalLight3D({color:0xFFFFFF, ambient:0.25, diffuse:0.75, specular:0.9})
   scene.addChild(light)
    
   view=new View3D({scene:scene,camera:camera});
   view.x=stage.stageWidth/2;
   view.y=stage.stageHeight/2;
   addChild(view);
}

Первая строка в нашей функции создает нашу 3D сцену. Затем мы добавляем в него трехмерные объекты. Для камеры мы выбираем HoverCamera3D, так как я считаю, что это лучший способ повернуть камеру вокруг объектов. На самом деле вам не нужно использовать свет для этого проекта, но он делает анимацию немного лучше 🙂 Наконец, мы создаем представление и устанавливаем его в середине сцены.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
function createBarUp(color:Number,x:Number):void {
    var bar:Cube = new Cube({width:30,height:50,depth:30})
    bar.material = new ShadingColorMaterial (color,{alpha:0.5})
    bar.x = x
    //
    bar.blendMode = BlendMode.ADD
    bars_up.push(bar)
    scene.addChild(bar)
}
function createBarDown(color:Number,x:Number):void {
    var bar:Cube = new Cube({width:30,height:50,depth:30})
    bar.material = new ShadingColorMaterial (color,{alpha:0.1})
    bar.x = x
    //
    bar.blendMode = BlendMode.ADD
    bars_down.push(bar)
    scene.addChild(bar)
}

Как видите, есть 2 функции для создания баров. Первый предназначен для основных баров, а второй — для отраженных баров. Второй дополнительно уменьшает альфа-значение столбцов.

Сначала мы создадим куб. Мы выбираем ShadingColorMaterial, потому что мы используем светлые и сплошные цвета. Функции имеют 2 параметра: первый задает цвет бара, а второй — его положение x.

Мы также добавим blendMode к кубам только потому, что они выглядят круто. После этого мы добавляем куб в его массив и на сцену.

1
2
3
4
5
6
7
8
9
function createBars():void {
    createBarUp(0x00CCFF,0)
    createBarUp(0xFF3300,-45)
    createBarUp(0xF9C806,+45)
     
    createBarDown(0x00CCFF,0)
    createBarDown(0xFF3300,-45)
    createBarDown(0xF9C806,+45)
}

Здесь мы создаем 3 основных бара и 3 отраженных бара. Как видите, их цвета и положения одинаковы. Мы установим их позиции как на диаграмме ниже:

отсутствующий флэш-визуализатор
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function render( e:Event ):void {
   view.render();
 
    SoundMixer.computeSpectrum(soundbyte, true);
   soundforces[0] = 0
   soundforces[1] = 0
   soundforces[2] = 0
    
    for (i = 0; i<300; i+=2) {
        t=soundbyte.readFloat();
        if (i>=0&&i<100) {
            soundforces[0]+=t*scaleoffset_low;
        }
        if (i>=100&&i<200) {
            soundforces[1]+=t*scaleoffset_mid;
        }
        if (i>=200&&i<300) {
            soundforces[2]+=t*scaleoffset_hig;
        }
    }
    
   scaleBarUp(bars_up[0],soundforces[0])
   scaleBarUp(bars_up[1],soundforces[1])
   scaleBarUp(bars_up[2],soundforces[2])
    
   scaleBarDown(bars_down[0],soundforces[0])
   scaleBarDown(bars_down[1],soundforces[1])
   scaleBarDown(bars_down[2],soundforces[2])
    
   light.x = camera.x
   light.y = camera.y
   light.z = camera.z
    
   camera.targetpanangle = stage.mouseX/stage.stageWidth*360
   camera.targettiltangle = stage.mouseY/stage.stageHeight*30
   camera.hover();
}

Это сложная часть. В функции рендеринга сначала мы визуализируем 3D. Затем мы используем SoundMixer для получения звуковых значений (для этого используется метод computeSpectrum). Мы выравниваем первые 3 элемента звуковой силы до 0, эффективно сбрасывая значения звука. После этого приходит цикл for.

отсутствующий флэш-визуализатор

низкие значения: songforces [0]

средние значения: songforces [1]

высокие значения: songforces [2]

После того, как мы получаем значения песни, мы масштабируем наши бары. Мы используем 2 функции для этого. Первый предназначен для основных баров, а второй — для отражений. Эти функции имеют 2 параметра; первый — это масштабируемая полоса, а второй — целевое значение высоты столбца.

Затем мы уравниваем положение нашего света с положением камеры. Это делает наш свет динамичным, а нашу анимацию более эффективной. Мы используем истинную пропорцию в математике, чтобы изменить положение камеры относительно mouseX и mouseY.

1
2
3
4
5
6
7
8
function scaleBarUp(bar:Cube,height:Number):void {
    bar.height += ( height — bar.height) * 0.3
    bar.y += ( height*0.5 — bar.y) * 0.3
}
function scaleBarDown(bar:Cube,height:Number):void {
    bar.height += ( height — bar.height) * 0.3
    bar.y += ( -height*0.5 — bar.y) * 0.3
}

Мы используем простую технику для анимации, эта диаграмма показывает пример:

отсутствующий флэш-визуализатор

ОК, мы масштабируем наши бары. Но нам нужно изменить значение Y для них тоже. Эта диаграмма показывает, почему мы должны изменить их:

В первой функции значение y столбцов положительное, а во второй — отрицательное. Основные полосы скользят вверх, отраженные полосы скользят вниз.

1
2
3
function startToRender():void {
  addEventListener(Event.ENTER_FRAME, render);
}
1
2
3
4
5
6
7
8
9
function startToPlay():void {
   var sound:Sound = new Sound();
   sound.load(new URLRequest(«song.mp3»));
   sound.play();
}
initAway3D();
createBars();
startToRender();
startToPlay();

В этих функциях мы запускаем функцию рендеринга и загружаем наш файл «song.mp3». Затем мы вызываем все наши функции одну за другой. Теперь вы можете проверить свой фильм и посмотреть, как прыгает решетка 🙂

На этом уроке мы узнали, как использовать отражение в Away3D и как получать звуковые данные. Ключом к этим типам эффектов является песня: вам нужно выбрать наилучшую песню, чтобы анимация действительно работала. Попробуйте это со своими собственными mp3 треками 🙂

Надеюсь, вам понравился этот урок, спасибо за чтение!