Как предложить направленный окружающий звук

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

Скажем, например, игрок стоит на пляже с волнами, разлетающимися вправо, и тропическим лесом слева. Каждый из этих регионов имеет свою отличную атмосферу. Если вы продолжите движение вперед, волны разлома должны быть такими же громкими справа от вас. Точно так же, если вы направляетесь в лес, звук волн должен медленно заменяться, когда вы удаляетесь от пляжа. Многие игры, похоже, воспринимают окружающий звук как смутно позиционный, так и в качестве экологического звука, который происходит извне сразу. То, что я пытаюсь, это разные области с разными звуками, поэтому вы можете на самом деле ориентироваться на них (т.е. вы должны быть в состоянии вернуться на пляж, слушая волны взлома, они должны быть не просто всенаправленными и слабыми.)

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

  • Поместите различные громкие звуки окружающего звука в определенные места. Это, безусловно, обеспечило бы определенную направленность, но мне интересно, могут ли океанские волны в будущем звучать впереди или позади и справа, когда вы идете по пляжу, так как вся атмосфера исходит из одной точки. Это также не позволило бы, скажем, выйти в океан мимо нарушителей и услышать их позади.
  • Размещение источников звука по всей площади, расположенных на разумном расстоянии друг от друга. Так, например, выключатели могут представлять собой один ряд волновых звуков, которые вы могли бы пройти или пройти мимо. Точно так же лес будет сеткой разбросанных звуков природы. Это похоже на лучший подход, но я задаюсь вопросом, быстро ли я ударил бы какой-то предел для количества звуков, которые могут быть смешаны. Я использую API веб-аудио, не уверен, что это разумно не отображает звуки, которые слишком мягкие, чтобы слышать. Хотя это кажется концептуально более простым, у длинного пляжа могут быть сотни различных звуковых узлов, расположенных вдоль него.
  • Отслеживайте ближайшее пересечение игрока с данной зоной и играйте в атмосферу в этих координатах. Поэтому, если вы идете по пляжу с разрывами волн справа от себя, я проецирую невидимый круг, насколько вы можете реально услышать, определить ближайший пересечение с различными звуковыми зонами и сыграть их соответствующую атмосферу. Возможно, ограничьте это до ближайших 2-3, так как больше, вероятно, будет подавляющим. Это кажется наименее требовательным в том, что он будет воспроизводить меньше звуков, но, скорее всего, потребует больше проверок на столкновение и, следовательно, может оказаться непрактичным.

Мысли?

3 голоса | спросил Nolan 24 AMpFri, 24 Apr 2015 04:31:48 +030031Friday 2015, 04:31:48

1 ответ


0

Это немного поздно, но может помочь другим.

Ваши идеи в основном звучат. Поместите звуковые излучатели вдоль края океана с разумным интервалом для ваших нужд. Если игрок может двигаться вертикально, вам нужно разместить их как стену, а не прямую. Ограничьте количество экземпляров этого типа звука, которые игрок может слышать за раз. Выберите излучатели на основе громкости. Вычислите объем, используя расстояние до излучателя, используя любую формулу падения, которая вам нравится; простой линейный должен быть точным. Вы устанавливаете расстояние, которое громкость начинает исчезать, и расстояние, на которое вы ничего не слышите. Вы играете в n самых громких. Любой звуковой движок может это сделать.

Однако, если вы катаетесь самостоятельно, тогда есть простая формула. У вас есть таблица углов громкоговорителей для каждого набора настроек колонок, которые вы будете поддерживать для вывода. Если это наушники, углы 90 и 270. Стандарты для углов 5.1 и 7.1 можно найти в Интернете.

Для каждого излучателя вычисляйте его угол и выясняйте, какие динамики находятся между ними и насколько далеко. Если звук составляет 75 °, а динамики - 30 и 120, то это составляет 50% пути от громкоговорителя А до громкоговорителя В. У вас должно быть число от 0,0 до 1,0. Умножьте это на pi /2. Это покрывает его под углом от 0 до 90 ° в радианах. Динамик Объем - это косинус этого значения, а динамик B - синус этого значения. Умножьте их на объем затухания, рассчитанный на излучателе, и это значения, которые вы посылаете каждому динамику. Для 50% случаев начальные значения для каждого динамика должны быть 0,707 или испорчены. Многие звуковые двигатели реализуют разлив, чтобы настроить чувствительность, но с несколькими излучателями это не имело бы значения.

Итак, используйте звуковой движок с полки или:

/*
Get distance to emitter.
Within falloff range?
  Get the volume V (0.0 to 1.0)
Do this for all emitters, keep the n loudest.

For each remaining emitter:
Get the angle to the emitter
Get the 2 speakers it's between (A & B)
Get the % (P) of how far your angle is from A to B (0.0 to 1.0)
Multiply P by pi/2
SpeakerA = V * cos(P)
SpeakerB = V * sin(P)
*/

Если ваша платформа принимает что-то отличное от значения от 0 до 1 для объема канала, вам необходимо его преобразовать.

ответил ChocoBilly 8 J000000Saturday17 2017, 07:31:11

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132