Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Problèmes avec SFML la spatialisation du son en 3D dans un contexte comme ogre3d  (Lu 2724 fois)

0 Membres et 1 Invité sur ce sujet

Milerius

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
[EDIT] : je viens de voir qu'il y avait une section Audio pour l'aide , si il est possible de déplacer ma demande dans la bonne section.

Bonjour,

Je suis actuellement en train de faire un projet pour mon école en deuxième année sous ogre3d,
il s'agit d'un jeux vidéo 3d, un mix entre un Bomberman et un Gauntlet

J'aimerais pouvoir jouer du son en fonction de mon placement sur mon environnement 3d, ma scène, j'ai hélas un fort problème, mon son s'entends que je sois de loin ou de prêt

Voici comment je procède selon la documentation SFML audio, tous d'abord mon endroit de départ :
,

Ensuite l'endroit où le son est censé être émis :



Le Squelette qui se frappe le torse est censé émettre un son quand il effectue cette action,

Voici un bout du code en exemple :
là où je set la position du squelette
_cesar->setPosition(710.6, 30, 557.64);
 

Ensuite là ou je set le Listener qui est ma caméra
       
sf::Listener::setGlobalVolume(50);
sf::Listener::setPosition(_cameraMan->getCamera()->getPosition().x,
_cameraMan->getCamera()->getPosition().y, _cameraMan->getCamera()->getPosition().z);
evt::EventManager::getSingletonPtr()->emit<evt::SoundEffectSpatialization>(effect::ImpactBoom, _cesar->getPosition(), true);
 

(_cameraman) est donc ma position actuelle de ma camera, moi , et mon Listener,
le Event Manager emit un type d’évent, qui prends en paramètre ce qui me permet de construire mon objet, l'enumeration relative au son, la position du son , ici c'est celle du Squelette dans l'arene, et si je veut faire loop le son, en effet je veut qu'on puisse entendre le Squelette ce frappé le torse en boucle alors j'envoie true)

Maintenant là où j'update mon Listener a chaque frame :
     
_soundMgr->update(evt.timeSinceLastFrame,
TestScene::getSingletonPtr()->_cameraMan->getCamera()->getPosition(),
TestScene::getSingletonPtr()->_cameraMan->getCamera()->getDirection());
 
void SoundEffectsManager::update(float timeSinceLastFrame, const Ogre::Vector3& position,
const Ogre::Vector3& direction)
        {
            sf::Listener::setPosition(static_cast<float> (position.x),
                static_cast<float> (position.y),
                static_cast<float> (position.z));
            //sf::Listener::setDirection(direction.x, direction.y, direction.z);
        }
 

là où le son est joué :
  void SoundEffectsManager::playSound(const effect& effectId, const Ogre::Vector3& position, bool loop)
        {
            if (!_effects.isLoaded(effectId))
                _effects.loadResource(effectId, _effectsPath[effectId]);
            _sndBuffer = _effects.getResource(effectId);
            _snd.setBuffer(_sndBuffer);
            _snd.setVolume(100);
            _snd.setPosition(position.x, position.y, position.z);
            _snd.setRelativeToListener(true);

            //test
            _snd.setAttenuation(10.f);
            _snd.setMinDistance(5.f);
            //Volume factor = MinDistance / (MinDistance + Attenuation * (max(Distance, MinDistance) - MinDistance))



            _snd.setLoop(loop);

            _snd.play();
      }
 


Donc voilà peut importe ma position sur ma scene , j'entends le son de partout et au même volume, l'atténuation/la min distance n'as pas l'air d'être pris en compte !

Merci d'avance!

Cordialement
« Modifié: Mai 17, 2017, 11:49:09 pm par Milerius »

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Bonjour, j'ai déjà eu un soucis de conception du même genre, mais en 2D, dès lors que j'utilisait plusieurs caméra 2D , je merdoyais avec le listener.

une piste , mon topic :

https://fr.sfml-dev.org/forums/index.php?topic=18505.0


Milerius

  • Newbie
  • *
  • Messages: 23
    • Voir le profil
à l'heure actuelle je n'ai que un seul Listener, et c'est ma caméra ! mon problèmes c'est que au départ je suis très loin du son émis qui est relatif a mon listener et je l'entends quand même et au maximum !

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
Question bête ? ton son est bien en mono ?

Cpl.Bator

  • Hero Member
  • *****
  • Messages: 540
    • Voir le profil
& j'aurais mis : _snd.setRelativeToListener(false);
la doc du son :

https://www.sfml-dev.org/tutorials/2.4/audio-spatialization.php