Wpis z mikrobloga

Mam zagwozdkę programistyczną: trzeba podstawić dźwięk silnika w samochodzie. Mamy dane obroty i częstotliwość dźwięku:

int rpm=10; //10=idle 100=max
float freqPercent;

jak podstawię w ten sposób to działa:

freqPercent = rpm;
ale chciałbym to zrobić na 3 dźwiękach: idle.wav (10%), accelerate.wav (10-100%), max.wav (100%)

I pytanie: czy to w ogóle da się zrealizować z punktu widzenia matematyki czy zawsze wyjdą błędy?

przy dwóch dźwiękach (idle i max) sprawa jest prosta bo uzależniamy je od rpm i przenikamy. Natomiast dźwięk pomiędzy - "przyspieszanie" musiałby mieć tak spasowaną częstotliwość żeby trafiał początkiem w idle.wav a końcem w max.wav

Potrzebowałbym wskazówki co do czego najlepiej zmapować

#unity3d #csharp
jacku - Mam zagwozdkę programistyczną: trzeba podstawić dźwięk silnika w samochodzie....

źródło: rat_racer_03

Pobierz
  • 6
@bruuh: najpopularniejsza metoda to wavetable gdzie jest z 10 próbek silnika w różnych prędkościach i to się przenika ale brzmi to imo sztucznie, ja bym chciał bardziej naturalne brzmienie, nagrane długim samplem zamiast dziesięcioma małymi
Wnioski po godzinie myślenia:
idle.wav powinien startować z freq=100% i dażyć do 1000% ściszając się
max.wav powinien startować z freq=10% i dążyć do 100% zgłaśniając się
accelerate powinien zawsze mieć freq=100%
accelerate powinien reagowac na wzrost freq pozostałych. Jeśli wzrost jest w zakresie y=1x to powinien się zgłaśniać a jeśli wychodzi poza zakres - ściszać
czyli jeśli przyspieszenie auta=1 to głośność=1 a odchyły od 1 są odpowiednio wyciszane
@jacku: Możesz to zrealizować, korzystając z interpolacji liniowej (lerp) między dźwiękami, aby uzyskać płynne przejście pomiędzy nimi. Aby to zrobić, będziesz potrzebował dwóch funkcji:

Interpolacja liniowa (lerp) - funkcja, która interpoluje między dwoma wartościami na podstawie współczynnika t.
Mapowanie wartości rpm na odpowiedni dźwięk i współczynnik interpolacji.
Najpierw stwórz funkcję interpolacji liniowej:

float lerp(float a, float b, float t) {
return a + t * (b - a);
}
Następnie zmapuj